aboutsummaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/api')
-rw-r--r--src/api/schema/events.rs29
-rw-r--r--src/api/schema/response.rs3
-rw-r--r--src/api/schema/tests.rs75
-rw-r--r--src/api/subscriptions.rs8
4 files changed, 105 insertions, 10 deletions
diff --git a/src/api/schema/events.rs b/src/api/schema/events.rs
index 6e489180..014288b1 100644
--- a/src/api/schema/events.rs
+++ b/src/api/schema/events.rs
@@ -22,6 +22,8 @@ pub enum Subscription {
WorkspaceUpdated {},
#[serde(rename = "workspace.renamed")]
WorkspaceRenamed {},
+ #[serde(rename = "workspace.moved")]
+ WorkspaceMoved {},
#[serde(rename = "workspace.closed")]
WorkspaceClosed {},
#[serde(rename = "workspace.focused")]
@@ -40,6 +42,8 @@ pub enum Subscription {
TabFocused {},
#[serde(rename = "tab.renamed")]
TabRenamed {},
+ #[serde(rename = "tab.moved")]
+ TabMoved {},
#[serde(rename = "pane.created")]
PaneCreated {},
#[serde(rename = "pane.closed")]
@@ -115,6 +119,9 @@ pub enum EventMatch {
#[serde(default, skip_serializing_if = "Option::is_none")]
label: Option<String>,
},
+ WorkspaceMoved {
+ workspace_id: String,
+ },
WorkspaceFocused {
workspace_id: String,
},
@@ -132,6 +139,9 @@ pub enum EventMatch {
#[serde(default, skip_serializing_if = "Option::is_none")]
label: Option<String>,
},
+ TabMoved {
+ tab_id: String,
+ },
TabFocused {
tab_id: String,
},
@@ -176,6 +186,7 @@ pub enum EventKind {
WorkspaceUpdated,
WorkspaceClosed,
WorkspaceRenamed,
+ WorkspaceMoved,
WorkspaceFocused,
WorktreeCreated,
WorktreeOpened,
@@ -183,6 +194,7 @@ pub enum EventKind {
TabCreated,
TabClosed,
TabRenamed,
+ TabMoved,
TabFocused,
PaneCreated,
PaneClosed,
@@ -201,6 +213,7 @@ impl EventKind {
EventKind::WorkspaceUpdated => "workspace.updated",
EventKind::WorkspaceClosed => "workspace.closed",
EventKind::WorkspaceRenamed => "workspace.renamed",
+ EventKind::WorkspaceMoved => "workspace.moved",
EventKind::WorkspaceFocused => "workspace.focused",
EventKind::WorktreeCreated => "worktree.created",
EventKind::WorktreeOpened => "worktree.opened",
@@ -208,6 +221,7 @@ impl EventKind {
EventKind::TabCreated => "tab.created",
EventKind::TabClosed => "tab.closed",
EventKind::TabRenamed => "tab.renamed",
+ EventKind::TabMoved => "tab.moved",
EventKind::TabFocused => "tab.focused",
EventKind::PaneCreated => "pane.created",
EventKind::PaneClosed => "pane.closed",
@@ -227,6 +241,7 @@ pub const KNOWN_EVENT_KINDS: &[EventKind] = &[
EventKind::WorkspaceUpdated,
EventKind::WorkspaceClosed,
EventKind::WorkspaceRenamed,
+ EventKind::WorkspaceMoved,
EventKind::WorkspaceFocused,
EventKind::WorktreeCreated,
EventKind::WorktreeOpened,
@@ -234,6 +249,7 @@ pub const KNOWN_EVENT_KINDS: &[EventKind] = &[
EventKind::TabCreated,
EventKind::TabClosed,
EventKind::TabRenamed,
+ EventKind::TabMoved,
EventKind::TabFocused,
EventKind::PaneCreated,
EventKind::PaneClosed,
@@ -250,6 +266,7 @@ pub const PLUGIN_HOOK_EVENT_KINDS: &[EventKind] = &[
EventKind::WorkspaceUpdated,
EventKind::WorkspaceClosed,
EventKind::WorkspaceRenamed,
+ EventKind::WorkspaceMoved,
EventKind::WorkspaceFocused,
EventKind::WorktreeCreated,
EventKind::WorktreeOpened,
@@ -257,6 +274,7 @@ pub const PLUGIN_HOOK_EVENT_KINDS: &[EventKind] = &[
EventKind::TabCreated,
EventKind::TabClosed,
EventKind::TabRenamed,
+ EventKind::TabMoved,
EventKind::TabFocused,
EventKind::PaneCreated,
EventKind::PaneClosed,
@@ -383,6 +401,11 @@ pub enum EventData {
workspace_id: String,
label: String,
},
+ WorkspaceMoved {
+ workspace_id: String,
+ insert_index: usize,
+ workspaces: Vec<WorkspaceInfo>,
+ },
WorkspaceFocused {
workspace_id: String,
},
@@ -414,6 +437,12 @@ pub enum EventData {
workspace_id: String,
label: String,
},
+ TabMoved {
+ tab_id: String,
+ workspace_id: String,
+ insert_index: usize,
+ tabs: Vec<TabInfo>,
+ },
TabFocused {
tab_id: String,
workspace_id: String,
diff --git a/src/api/schema/response.rs b/src/api/schema/response.rs
index 51ea0d36..57ab215b 100644
--- a/src/api/schema/response.rs
+++ b/src/api/schema/response.rs
@@ -130,6 +130,9 @@ pub enum ResponseResult {
LayoutApply {
layout: LayoutDescription,
},
+ LayoutSplitRatioSet {
+ layout: LayoutDescription,
+ },
PaneNeighbor {
neighbor: PaneNeighborResult,
},
diff --git a/src/api/schema/tests.rs b/src/api/schema/tests.rs
index d9ebe30b..dd2004cf 100644
--- a/src/api/schema/tests.rs
+++ b/src/api/schema/tests.rs
@@ -250,18 +250,39 @@ fn pane_process_info_request_round_trips() {
#[test]
fn event_envelope_round_trips() {
- let event = EventEnvelope {
- event: EventKind::PaneOutputChanged,
- data: EventData::PaneOutputChanged {
- pane_id: "p_1".into(),
- workspace_id: "w_1".into(),
- revision: 42,
+ let events = [
+ EventEnvelope {
+ event: EventKind::PaneOutputChanged,
+ data: EventData::PaneOutputChanged {
+ pane_id: "p_1".into(),
+ workspace_id: "w_1".into(),
+ revision: 42,
+ },
},
- };
+ EventEnvelope {
+ event: EventKind::WorkspaceMoved,
+ data: EventData::WorkspaceMoved {
+ workspace_id: "w_1".into(),
+ insert_index: 2,
+ workspaces: vec![],
+ },
+ },
+ EventEnvelope {
+ event: EventKind::TabMoved,
+ data: EventData::TabMoved {
+ tab_id: "w_1:1".into(),
+ workspace_id: "w_1".into(),
+ insert_index: 1,
+ tabs: vec![],
+ },
+ },
+ ];
- let json = serde_json::to_string(&event).unwrap();
- let restored: EventEnvelope = serde_json::from_str(&json).unwrap();
- assert_eq!(restored, event);
+ for event in events {
+ let json = serde_json::to_string(&event).unwrap();
+ let restored: EventEnvelope = serde_json::from_str(&json).unwrap();
+ assert_eq!(restored, event);
+ }
}
#[test]
@@ -700,6 +721,28 @@ fn layout_export_apply_round_trip() {
let json = serde_json::to_string(&response).unwrap();
let restored: SuccessResponse = serde_json::from_str(&json).unwrap();
assert_eq!(restored, response);
+
+ let response = SuccessResponse {
+ id: "layout_ratio".into(),
+ result: ResponseResult::LayoutSplitRatioSet {
+ layout: LayoutDescription {
+ workspace_id: "w1".into(),
+ tab_id: "w1:1".into(),
+ zoomed: false,
+ focused_pane_id: "w1-1".into(),
+ root: LayoutNode::Pane {
+ pane: LayoutPane {
+ pane_id: Some("w1-1".into()),
+ ..Default::default()
+ },
+ },
+ },
+ },
+ };
+ let json = serde_json::to_string(&response).unwrap();
+ assert!(json.contains("\"type\":\"layout_split_ratio_set\""));
+ let restored: SuccessResponse = serde_json::from_str(&json).unwrap();
+ assert_eq!(restored, response);
}
#[test]
@@ -752,6 +795,18 @@ fn authority_mutation_requests_round_trip() {
assert_eq!(json["method"], "layout.set_split_ratio");
let restored: Request = serde_json::from_value(json).unwrap();
assert_eq!(restored, split_ratio);
+
+ let subscription = Request {
+ id: "sub_moves".into(),
+ method: Method::EventsSubscribe(EventsSubscribeParams {
+ subscriptions: vec![Subscription::WorkspaceMoved {}, Subscription::TabMoved {}],
+ }),
+ };
+ let json = serde_json::to_string(&subscription).unwrap();
+ assert!(json.contains("\"type\":\"workspace.moved\""));
+ assert!(json.contains("\"type\":\"tab.moved\""));
+ let restored: Request = serde_json::from_str(&json).unwrap();
+ assert_eq!(restored, subscription);
}
#[test]
diff --git a/src/api/subscriptions.rs b/src/api/subscriptions.rs
index d71ea24d..f3b82090 100644
--- a/src/api/subscriptions.rs
+++ b/src/api/subscriptions.rs
@@ -120,6 +120,10 @@ impl ActiveSubscription {
event_kind: crate::api::schema::EventKind::WorkspaceRenamed,
last_sequence: 0,
})),
+ Subscription::WorkspaceMoved {} => Ok(Self::Event(ActiveEventSubscription {
+ event_kind: crate::api::schema::EventKind::WorkspaceMoved,
+ last_sequence: 0,
+ })),
Subscription::WorkspaceClosed {} => Ok(Self::Event(ActiveEventSubscription {
event_kind: crate::api::schema::EventKind::WorkspaceClosed,
last_sequence: 0,
@@ -156,6 +160,10 @@ impl ActiveSubscription {
event_kind: crate::api::schema::EventKind::TabRenamed,
last_sequence: 0,
})),
+ Subscription::TabMoved {} => Ok(Self::Event(ActiveEventSubscription {
+ event_kind: crate::api::schema::EventKind::TabMoved,
+ last_sequence: 0,
+ })),
Subscription::PaneCreated {} => Ok(Self::Event(ActiveEventSubscription {
event_kind: crate::api::schema::EventKind::PaneCreated,
last_sequence: 0,