aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-30 19:55:11 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-30 19:57:02 +0300
commit9a91a2ac41a5b2fbc2811922750a782b45115219 (patch)
tree53009544365b1b3163d37e058eb2a1ea8f29f553 /src
parent26db26e416318e17a6e7f3f196ec72109fb37998 (diff)
refactor: route tui mutations through runtime dispatch
Diffstat (limited to 'src')
-rw-r--r--src/app/input/modal.rs14
-rw-r--r--src/app/input/navigate.rs54
-rw-r--r--src/app/mod.rs7
-rw-r--r--src/app/runtime_mutations.rs59
-rw-r--r--src/app/worktrees.rs6
5 files changed, 89 insertions, 51 deletions
diff --git a/src/app/input/modal.rs b/src/app/input/modal.rs
index e63cdb70..51e19f78 100644
--- a/src/app/input/modal.rs
+++ b/src/app/input/modal.rs
@@ -933,7 +933,7 @@ impl App {
match self.state.mode {
Mode::RenameWorkspace if !self.state.workspaces.is_empty() && !new_name.is_empty() => {
let workspace_id = self.public_workspace_id(self.state.selected);
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.workspace.rename",
crate::api::schema::Method::WorkspaceRename(
crate::api::schema::WorkspaceRenameParams {
@@ -950,7 +950,7 @@ impl App {
} else {
Some(new_name)
};
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.tab.create_named",
crate::api::schema::Method::TabCreate(crate::api::schema::TabCreateParams {
workspace_id: None,
@@ -976,7 +976,7 @@ impl App {
.is_some_and(|name| new_name == name);
if !keep_auto_name {
if let Some(tab_id) = self.public_tab_id(ws_idx, tab_idx) {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.tab.rename",
crate::api::schema::Method::TabRename(
crate::api::schema::TabRenameParams {
@@ -993,7 +993,7 @@ impl App {
(self.state.active, self.state.rename_pane_target)
{
if let Some(pane_id) = self.public_pane_id(ws_idx, pane_id) {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.pane.rename",
crate::api::schema::Method::PaneRename(
crate::api::schema::PaneRenameParams {
@@ -1058,7 +1058,7 @@ impl App {
_ => None,
};
if let Some(direction) = direction {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.pane.resize",
crate::api::schema::Method::PaneResize(crate::api::schema::PaneResizeParams {
pane_id: None,
@@ -1185,7 +1185,7 @@ impl App {
Some("Clear pane name"),
) => {
if let Some(pane_id) = self.public_pane_id(ws_idx, pane_id) {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.pane.clear_name",
crate::api::schema::Method::PaneRename(
crate::api::schema::PaneRenameParams {
@@ -1211,7 +1211,7 @@ impl App {
if let (Some(source_public_id), Some(target_public_id)) =
(source_public_id, target_public_id)
{
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.pane.swap_exact",
crate::api::schema::Method::PaneSwap(crate::api::schema::PaneSwapParams {
pane_id: None,
diff --git a/src/app/input/navigate.rs b/src/app/input/navigate.rs
index c6ad3e16..cffa7bd6 100644
--- a/src/app/input/navigate.rs
+++ b/src/app/input/navigate.rs
@@ -107,7 +107,7 @@ impl App {
let previous_mode = self.state.mode;
match action {
NavigateAction::NewWorkspace => {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.key.workspace.create",
crate::api::schema::Method::WorkspaceCreate(
crate::api::schema::WorkspaceCreateParams {
@@ -221,7 +221,7 @@ impl App {
if self.state.prompt_new_tab_name {
super::modal::open_new_tab_dialog(&mut self.state);
} else {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.key.tab.create",
crate::api::schema::Method::TabCreate(
crate::api::schema::TabCreateParams {
@@ -354,27 +354,17 @@ impl App {
pub(crate) fn focus_workspace_idx_via_api(&mut self, ws_idx: usize) {
let workspace_id = self.public_workspace_id(ws_idx);
- self.dispatch_tui_api_request(
- "tui.workspace.focus",
- crate::api::schema::Method::WorkspaceFocus(crate::api::schema::WorkspaceTarget {
- workspace_id,
- }),
- );
+ self.runtime_workspace_focus("tui.workspace.focus", workspace_id);
}
pub(crate) fn close_workspace_idx_via_api(&mut self, ws_idx: usize) {
let workspace_id = self.public_workspace_id(ws_idx);
- self.dispatch_tui_api_request(
- "tui.workspace.close",
- crate::api::schema::Method::WorkspaceClose(crate::api::schema::WorkspaceTarget {
- workspace_id,
- }),
- );
+ self.runtime_workspace_close("tui.workspace.close", workspace_id);
}
pub(crate) fn move_workspace_via_api(&mut self, source_ws_idx: usize, insert_idx: usize) {
let workspace_id = self.public_workspace_id(source_ws_idx);
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.workspace.move",
crate::api::schema::Method::WorkspaceMove(crate::api::schema::WorkspaceMoveParams {
workspace_id,
@@ -390,10 +380,7 @@ impl App {
let Some(tab_id) = self.public_tab_id(ws_idx, tab_idx) else {
return;
};
- self.dispatch_tui_api_request(
- "tui.tab.focus",
- crate::api::schema::Method::TabFocus(crate::api::schema::TabTarget { tab_id }),
- );
+ self.runtime_tab_focus("tui.tab.focus", tab_id);
}
pub(crate) fn close_active_tab_via_api(&mut self) {
@@ -404,10 +391,7 @@ impl App {
let Some(tab_id) = self.public_tab_id(ws_idx, tab_idx) else {
return;
};
- self.dispatch_tui_api_request(
- "tui.tab.close",
- crate::api::schema::Method::TabClose(crate::api::schema::TabTarget { tab_id }),
- );
+ self.runtime_tab_close("tui.tab.close", tab_id);
}
pub(crate) fn move_tab_via_api(
@@ -419,7 +403,7 @@ impl App {
let Some(tab_id) = self.public_tab_id(ws_idx, source_tab_idx) else {
return;
};
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.tab.move",
crate::api::schema::Method::TabMove(crate::api::schema::TabMoveParams {
tab_id,
@@ -436,10 +420,7 @@ impl App {
let Some(pane_id) = self.public_pane_id(ws_idx, pane_id) else {
return;
};
- self.dispatch_tui_api_request(
- "tui.pane.focus",
- crate::api::schema::Method::PaneFocus(crate::api::schema::PaneTarget { pane_id }),
- );
+ self.runtime_pane_focus("tui.pane.focus", pane_id);
}
pub(crate) fn focus_pane_direction_via_api(&mut self, direction: NavDirection) {
@@ -447,7 +428,7 @@ impl App {
self.focus_pane_internal_via_api(ws_idx, target);
return;
}
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.pane.focus_direction",
crate::api::schema::Method::PaneFocusDirection(
crate::api::schema::PaneFocusDirectionParams {
@@ -463,7 +444,7 @@ impl App {
let source_pane_id = self.public_pane_id(ws_idx, source);
let target_pane_id = self.public_pane_id(ws_idx, target);
if let (Some(source_pane_id), Some(target_pane_id)) = (source_pane_id, target_pane_id) {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.pane.swap_exact",
crate::api::schema::Method::PaneSwap(crate::api::schema::PaneSwapParams {
pane_id: None,
@@ -475,7 +456,7 @@ impl App {
return;
}
}
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.pane.swap",
crate::api::schema::Method::PaneSwap(crate::api::schema::PaneSwapParams {
pane_id: None,
@@ -490,7 +471,7 @@ impl App {
&mut self,
direction: crate::api::schema::SplitDirection,
) {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.pane.split",
crate::api::schema::Method::PaneSplit(crate::api::schema::PaneSplitParams {
workspace_id: None,
@@ -511,14 +492,11 @@ impl App {
let Some(pane_id) = self.public_pane_id(ws_idx, pane_id) else {
return;
};
- self.dispatch_tui_api_request(
- "tui.pane.close",
- crate::api::schema::Method::PaneClose(crate::api::schema::PaneTarget { pane_id }),
- );
+ self.runtime_pane_close("tui.pane.close", pane_id);
}
pub(crate) fn zoom_focused_pane_via_api(&mut self) {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.pane.zoom",
crate::api::schema::Method::PaneZoom(crate::api::schema::PaneZoomParams {
pane_id: None,
@@ -528,7 +506,7 @@ impl App {
}
pub(crate) fn set_split_ratio_via_api(&mut self, path: Vec<bool>, ratio: f32) {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.layout.set_split_ratio",
crate::api::schema::Method::LayoutSetSplitRatio(
crate::api::schema::LayoutSetSplitRatioParams {
diff --git a/src/app/mod.rs b/src/app/mod.rs
index cfcbe07e..04de4c84 100644
--- a/src/app/mod.rs
+++ b/src/app/mod.rs
@@ -14,6 +14,7 @@ mod creation;
mod ids;
mod input;
mod runtime;
+mod runtime_mutations;
mod session;
pub mod state;
mod terminal_targets;
@@ -886,7 +887,7 @@ impl App {
if self.state.request_new_workspace {
self.state.request_new_workspace = false;
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.workspace.create",
crate::api::schema::Method::WorkspaceCreate(
crate::api::schema::WorkspaceCreateParams {
@@ -903,7 +904,7 @@ impl App {
if self.state.request_new_tab {
self.state.request_new_tab = false;
let label = self.state.requested_new_tab_name.take();
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.tab.create",
crate::api::schema::Method::TabCreate(crate::api::schema::TabCreateParams {
workspace_id: None,
@@ -927,7 +928,7 @@ impl App {
}
if let Some(cwd) = self.state.request_new_workspace_cwd.take() {
- self.dispatch_tui_api_request(
+ self.dispatch_tui_runtime_mutation(
"tui.workspace.create_cwd",
crate::api::schema::Method::WorkspaceCreate(
crate::api::schema::WorkspaceCreateParams {
diff --git a/src/app/runtime_mutations.rs b/src/app/runtime_mutations.rs
new file mode 100644
index 00000000..fae52d60
--- /dev/null
+++ b/src/app/runtime_mutations.rs
@@ -0,0 +1,59 @@
+use crate::api::schema::{Method, PaneTarget, TabTarget, WorkspaceTarget};
+
+use super::App;
+
+impl App {
+ pub(crate) fn dispatch_tui_runtime_mutation(
+ &mut self,
+ id: &'static str,
+ method: Method,
+ ) -> String {
+ self.dispatch_tui_api_request(id, method)
+ }
+
+ pub(crate) fn dispatch_tui_deferred_runtime_mutation(
+ &mut self,
+ id: &'static str,
+ method: Method,
+ ) -> Option<String> {
+ self.dispatch_tui_deferred_api_request(id, method)
+ }
+
+ pub(crate) fn runtime_workspace_focus(
+ &mut self,
+ id: &'static str,
+ workspace_id: String,
+ ) -> String {
+ self.dispatch_tui_runtime_mutation(
+ id,
+ Method::WorkspaceFocus(WorkspaceTarget { workspace_id }),
+ )
+ }
+
+ pub(crate) fn runtime_workspace_close(
+ &mut self,
+ id: &'static str,
+ workspace_id: String,
+ ) -> String {
+ self.dispatch_tui_runtime_mutation(
+ id,
+ Method::WorkspaceClose(WorkspaceTarget { workspace_id }),
+ )
+ }
+
+ pub(crate) fn runtime_tab_focus(&mut self, id: &'static str, tab_id: String) -> String {
+ self.dispatch_tui_runtime_mutation(id, Method::TabFocus(TabTarget { tab_id }))
+ }
+
+ pub(crate) fn runtime_tab_close(&mut self, id: &'static str, tab_id: String) -> String {
+ self.dispatch_tui_runtime_mutation(id, Method::TabClose(TabTarget { tab_id }))
+ }
+
+ pub(crate) fn runtime_pane_focus(&mut self, id: &'static str, pane_id: String) -> String {
+ self.dispatch_tui_runtime_mutation(id, Method::PaneFocus(PaneTarget { pane_id }))
+ }
+
+ pub(crate) fn runtime_pane_close(&mut self, id: &'static str, pane_id: String) -> String {
+ self.dispatch_tui_runtime_mutation(id, Method::PaneClose(PaneTarget { pane_id }))
+ }
+}
diff --git a/src/app/worktrees.rs b/src/app/worktrees.rs
index ce8be5ec..ae195929 100644
--- a/src/app/worktrees.rs
+++ b/src/app/worktrees.rs
@@ -590,7 +590,7 @@ impl App {
let workspace_id = create.source_workspace_id.clone();
let checkout_path = create.checkout_path.display().to_string();
- let immediate_response = self.dispatch_tui_deferred_api_request(
+ let immediate_response = self.dispatch_tui_deferred_runtime_mutation(
"tui.worktree.create",
crate::api::schema::Method::WorktreeCreate(crate::api::schema::WorktreeCreateParams {
workspace_id: Some(workspace_id),
@@ -720,7 +720,7 @@ impl App {
};
let source_workspace_id = open.source_workspace_id.clone();
- let response = self.dispatch_tui_api_request(
+ let response = self.dispatch_tui_runtime_mutation(
"tui.worktree.open",
crate::api::schema::Method::WorktreeOpen(crate::api::schema::WorktreeOpenParams {
workspace_id: Some(source_workspace_id),
@@ -763,7 +763,7 @@ impl App {
remove.error = None;
let workspace_id = remove.workspace_id.clone();
let force = remove.force_confirmation;
- let immediate_response = self.dispatch_tui_deferred_api_request(
+ let immediate_response = self.dispatch_tui_deferred_runtime_mutation(
"tui.worktree.remove",
crate::api::schema::Method::WorktreeRemove(crate::api::schema::WorktreeRemoveParams {
workspace_id,