diff options
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/schema/events.rs | 29 | ||||
| -rw-r--r-- | src/api/schema/response.rs | 3 | ||||
| -rw-r--r-- | src/api/schema/tests.rs | 75 | ||||
| -rw-r--r-- | src/api/subscriptions.rs | 8 |
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, |
