diff options
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/mod.rs | 1 | ||||
| -rw-r--r-- | src/api/schema.rs | 2 | ||||
| -rw-r--r-- | src/api/schema/events.rs | 12 | ||||
| -rw-r--r-- | src/api/schema/tests.rs | 22 | ||||
| -rw-r--r-- | src/api/schema/workspaces.rs | 7 | ||||
| -rw-r--r-- | src/api/server.rs | 1 | ||||
| -rw-r--r-- | src/api/subscriptions.rs | 4 |
7 files changed, 49 insertions, 0 deletions
diff --git a/src/api/mod.rs b/src/api/mod.rs index 994b2d87..7520d83c 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -29,6 +29,7 @@ pub(crate) fn request_changes_ui(request: &Request) -> bool { | Method::WorkspaceFocus(_) | Method::WorkspaceRename(_) | Method::WorkspaceMove(_) + | Method::WorkspaceMoveBlock(_) | Method::WorkspaceReportMetadata(_) | Method::WorkspaceClose(_) | Method::WorktreeCreate(_) diff --git a/src/api/schema.rs b/src/api/schema.rs index 72d9e53a..42179c06 100644 --- a/src/api/schema.rs +++ b/src/api/schema.rs @@ -75,6 +75,8 @@ pub enum Method { WorkspaceRename(WorkspaceRenameParams), #[serde(rename = "workspace.move")] WorkspaceMove(WorkspaceMoveParams), + #[serde(rename = "workspace.move_block")] + WorkspaceMoveBlock(WorkspaceMoveBlockParams), #[serde(rename = "workspace.report_metadata")] WorkspaceReportMetadata(WorkspaceReportMetadataParams), #[serde(rename = "workspace.close")] diff --git a/src/api/schema/events.rs b/src/api/schema/events.rs index 50b5d522..52ac6c96 100644 --- a/src/api/schema/events.rs +++ b/src/api/schema/events.rs @@ -26,6 +26,8 @@ pub enum Subscription { WorkspaceRenamed {}, #[serde(rename = "workspace.moved")] WorkspaceMoved {}, + #[serde(rename = "workspace.reordered")] + WorkspaceReordered {}, #[serde(rename = "workspace.closed")] WorkspaceClosed {}, #[serde(rename = "workspace.focused")] @@ -196,6 +198,7 @@ pub enum EventKind { WorkspaceClosed, WorkspaceRenamed, WorkspaceMoved, + WorkspaceReordered, WorkspaceFocused, WorktreeCreated, WorktreeOpened, @@ -226,6 +229,7 @@ impl EventKind { EventKind::WorkspaceClosed => "workspace.closed", EventKind::WorkspaceRenamed => "workspace.renamed", EventKind::WorkspaceMoved => "workspace.moved", + EventKind::WorkspaceReordered => "workspace.reordered", EventKind::WorkspaceFocused => "workspace.focused", EventKind::WorktreeCreated => "worktree.created", EventKind::WorktreeOpened => "worktree.opened", @@ -257,6 +261,7 @@ pub const KNOWN_EVENT_KINDS: &[EventKind] = &[ EventKind::WorkspaceClosed, EventKind::WorkspaceRenamed, EventKind::WorkspaceMoved, + EventKind::WorkspaceReordered, EventKind::WorkspaceFocused, EventKind::WorktreeCreated, EventKind::WorktreeOpened, @@ -284,6 +289,7 @@ pub const PLUGIN_HOOK_EVENT_KINDS: &[EventKind] = &[ EventKind::WorkspaceClosed, EventKind::WorkspaceRenamed, EventKind::WorkspaceMoved, + EventKind::WorkspaceReordered, EventKind::WorkspaceFocused, EventKind::WorktreeCreated, EventKind::WorktreeOpened, @@ -437,6 +443,12 @@ pub enum EventData { insert_index: usize, workspaces: Vec<WorkspaceInfo>, }, + WorkspaceReordered { + workspace_ids: Vec<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + before_workspace_id: Option<String>, + workspaces: Vec<WorkspaceInfo>, + }, WorkspaceFocused { workspace_id: String, }, diff --git a/src/api/schema/tests.rs b/src/api/schema/tests.rs index 9fcc03b0..16894dbf 100644 --- a/src/api/schema/tests.rs +++ b/src/api/schema/tests.rs @@ -470,6 +470,14 @@ fn event_envelope_round_trips() { }, }, EventEnvelope { + event: EventKind::WorkspaceReordered, + data: EventData::WorkspaceReordered { + workspace_ids: vec!["w_1".into(), "w_2".into()], + before_workspace_id: Some("w_3".into()), + workspaces: vec![], + }, + }, + EventEnvelope { event: EventKind::TabMoved, data: EventData::TabMoved { tab_id: "w_1:1".into(), @@ -1063,6 +1071,18 @@ fn authority_mutation_requests_round_trip() { let restored: Request = serde_json::from_value(json).unwrap(); assert_eq!(restored, workspace_move); + let workspace_move_block = Request { + id: "move_ws_block".into(), + method: Method::WorkspaceMoveBlock(WorkspaceMoveBlockParams { + workspace_ids: vec!["w1".into(), "w2".into()], + before_workspace_id: Some("w3".into()), + }), + }; + let json = serde_json::to_value(&workspace_move_block).unwrap(); + assert_eq!(json["method"], "workspace.move_block"); + let restored: Request = serde_json::from_value(json).unwrap(); + assert_eq!(restored, workspace_move_block); + let tab_move = Request { id: "move_tab".into(), method: Method::TabMove(TabMoveParams { @@ -1105,6 +1125,7 @@ fn authority_mutation_requests_round_trip() { method: Method::EventsSubscribe(EventsSubscribeParams { subscriptions: vec![ Subscription::WorkspaceMoved {}, + Subscription::WorkspaceReordered {}, Subscription::TabMoved {}, Subscription::LayoutUpdated {}, ], @@ -1112,6 +1133,7 @@ fn authority_mutation_requests_round_trip() { }; let json = serde_json::to_string(&subscription).unwrap(); assert!(json.contains("\"type\":\"workspace.moved\"")); + assert!(json.contains("\"type\":\"workspace.reordered\"")); assert!(json.contains("\"type\":\"tab.moved\"")); assert!(json.contains("\"type\":\"layout.updated\"")); let restored: Request = serde_json::from_str(&json).unwrap(); diff --git a/src/api/schema/workspaces.rs b/src/api/schema/workspaces.rs index a6177982..f9ad4ced 100644 --- a/src/api/schema/workspaces.rs +++ b/src/api/schema/workspaces.rs @@ -29,6 +29,13 @@ pub struct WorkspaceMoveParams { } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] +pub struct WorkspaceMoveBlockParams { + pub workspace_ids: Vec<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub before_workspace_id: Option<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorkspaceReportMetadataParams { pub workspace_id: String, pub source: String, diff --git a/src/api/server.rs b/src/api/server.rs index 5bc90ef9..0598faea 100644 --- a/src/api/server.rs +++ b/src/api/server.rs @@ -359,6 +359,7 @@ fn api_method_name(method: &Method) -> &'static str { Method::WorkspaceFocus(_) => "workspace.focus", Method::WorkspaceRename(_) => "workspace.rename", Method::WorkspaceMove(_) => "workspace.move", + Method::WorkspaceMoveBlock(_) => "workspace.move_block", Method::WorkspaceReportMetadata(_) => "workspace.report_metadata", Method::WorkspaceClose(_) => "workspace.close", Method::WorktreeList(_) => "worktree.list", diff --git a/src/api/subscriptions.rs b/src/api/subscriptions.rs index 13a340b6..7bcc7b77 100644 --- a/src/api/subscriptions.rs +++ b/src/api/subscriptions.rs @@ -132,6 +132,10 @@ impl ActiveSubscription { event_kind: crate::api::schema::EventKind::WorkspaceMoved, last_sequence: 0, })), + Subscription::WorkspaceReordered {} => Ok(Self::Event(ActiveEventSubscription { + event_kind: crate::api::schema::EventKind::WorkspaceReordered, + last_sequence: 0, + })), Subscription::WorkspaceClosed {} => Ok(Self::Event(ActiveEventSubscription { event_kind: crate::api::schema::EventKind::WorkspaceClosed, last_sequence: 0, |
