aboutsummaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-13 23:05:30 +0300
committerGitHub <noreply@github.com>2026-09-13 23:05:30 +0300
commitf8e59221cbe5117f8f691a36affa374f5a986a9f (patch)
tree3b2792683eff251b061fbbad7343ecffafe91aab /src/api
parent59167658455442ffd2cd5b72a0fa81bcc4bcdf9e (diff)
feat: add ctrl-hover highlighting and fix wrapped links (#4074)
refs #1282
Diffstat (limited to 'src/api')
-rw-r--r--src/api/schema.rs2
-rw-r--r--src/api/schema/panes.rs8
-rw-r--r--src/api/schema/response.rs3
-rw-r--r--src/api/schema/tests.rs27
-rw-r--r--src/api/server.rs1
5 files changed, 39 insertions, 2 deletions
diff --git a/src/api/schema.rs b/src/api/schema.rs
index ba9f0c3a..7c58fb69 100644
--- a/src/api/schema.rs
+++ b/src/api/schema.rs
@@ -185,6 +185,8 @@ pub enum Method {
PaneInputSet(PaneInputSetParams),
#[serde(rename = "pane.link.activate")]
PaneLinkActivate(PaneLinkActivateParams),
+ #[serde(rename = "pane.link.resolve")]
+ PaneLinkResolve(PaneLinkActivateParams),
#[serde(rename = "pane.rename")]
PaneRename(PaneRenameParams),
#[serde(rename = "pane.send_text")]
diff --git a/src/api/schema/panes.rs b/src/api/schema/panes.rs
index 517870f7..6cbcaf43 100644
--- a/src/api/schema/panes.rs
+++ b/src/api/schema/panes.rs
@@ -762,3 +762,11 @@ pub struct PaneReadResult {
pub revision: u64,
pub truncated: bool,
}
+
+/// Inclusive display-cell columns on a pane's current viewport.
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
+pub struct PaneLinkRegion {
+ pub row: u16,
+ pub start_col: u16,
+ pub end_col: u16,
+}
diff --git a/src/api/schema/response.rs b/src/api/schema/response.rs
index e6d4de4d..5cc66bdc 100644
--- a/src/api/schema/response.rs
+++ b/src/api/schema/response.rs
@@ -274,6 +274,9 @@ pub enum ResponseResult {
context: PluginInvocationContext,
log: PluginCommandLogInfo,
},
+ PaneLinkResolved {
+ regions: Vec<super::panes::PaneLinkRegion>,
+ },
PaneLinkActivated {
#[serde(default, skip_serializing_if = "Option::is_none")]
url: Option<String>,
diff --git a/src/api/schema/tests.rs b/src/api/schema/tests.rs
index b566e8f6..d51c565d 100644
--- a/src/api/schema/tests.rs
+++ b/src/api/schema/tests.rs
@@ -201,8 +201,7 @@ fn generated_protocol_schema_artifact_is_current() {
)
});
assert_eq!(
- expected,
- actual,
+ expected, actual,
"generated API schema artifact is stale; run `HERDR_UPDATE_API_SCHEMA=1 just test-one generated_protocol_schema_artifact_is_current`"
);
}
@@ -1433,3 +1432,27 @@ fn popup_close_request_round_trips() {
assert_eq!(json["method"], "popup.close");
assert_eq!(json["params"], serde_json::json!({}));
}
+
+#[test]
+fn pane_link_resolve_round_trips() {
+ let request: Request = serde_json::from_value(serde_json::json!({
+ "id": "hover", "method": "pane.link.resolve",
+ "params": {"pane_id": "pane-1", "viewport_row": 2, "col": 3}
+ }))
+ .unwrap();
+ assert!(matches!(request.method, Method::PaneLinkResolve(_)));
+ let result = ResponseResult::PaneLinkResolved {
+ regions: vec![PaneLinkRegion {
+ row: 2,
+ start_col: 3,
+ end_col: 9,
+ }],
+ };
+ let json = serde_json::to_value(&result).unwrap();
+ assert_eq!(json["type"], "pane_link_resolved");
+ assert_eq!(json["regions"][0]["end_col"], 9);
+ assert_eq!(
+ serde_json::from_value::<ResponseResult>(json).unwrap(),
+ result
+ );
+}
diff --git a/src/api/server.rs b/src/api/server.rs
index b8ef7c38..ea7597e7 100644
--- a/src/api/server.rs
+++ b/src/api/server.rs
@@ -454,6 +454,7 @@ pub(crate) fn api_method_name(method: &Method) -> &'static str {
Method::PaneFocus(_) => "pane.focus",
Method::PaneInputSet(_) => "pane.input.set",
Method::PaneLinkActivate(_) => "pane.link.activate",
+ Method::PaneLinkResolve(_) => "pane.link.resolve",
Method::PaneRename(_) => "pane.rename",
Method::PaneSendText(_) => "pane.send_text",
Method::PaneSendKeys(_) => "pane.send_keys",