Skip to main content

codetether_agent/tui/app/
settings.rs

1use crate::session::Session;
2use crate::tui::app::commands::set_auto_apply_edits;
3use crate::tui::app::state::App;
4
5fn on_off_label(enabled: bool) -> &'static str {
6    if enabled { "ON" } else { "OFF" }
7}
8
9pub fn network_access_status_message(enabled: bool) -> String {
10    format!("TUI network access: {}", on_off_label(enabled))
11}
12
13pub async fn set_network_access(app: &mut App, session: &mut Session, next: bool) {
14    app.state.allow_network = next;
15    session.metadata.allow_network = next;
16
17    if next {
18        unsafe {
19            std::env::set_var("CODETETHER_SANDBOX_BASH_ALLOW_NETWORK", "1");
20        }
21    } else {
22        unsafe {
23            std::env::remove_var("CODETETHER_SANDBOX_BASH_ALLOW_NETWORK");
24        }
25    }
26
27    match session.save().await {
28        Ok(()) => {
29            app.state.status = network_access_status_message(next);
30        }
31        Err(error) => {
32            app.state.status = format!(
33                "{} (not persisted: {error})",
34                network_access_status_message(next)
35            );
36        }
37    }
38}
39
40pub async fn toggle_network_access(app: &mut App, session: &mut Session) {
41    set_network_access(app, session, !app.state.allow_network).await;
42}
43
44pub fn autocomplete_status_message(enabled: bool) -> String {
45    format!("TUI slash autocomplete: {}", on_off_label(enabled))
46}
47
48pub async fn set_slash_autocomplete(app: &mut App, session: &mut Session, next: bool) {
49    app.state.slash_autocomplete = next;
50    session.metadata.slash_autocomplete = next;
51
52    match session.save().await {
53        Ok(()) => {
54            app.state.status = autocomplete_status_message(next);
55        }
56        Err(error) => {
57            app.state.status = format!(
58                "{} (not persisted: {error})",
59                autocomplete_status_message(next)
60            );
61        }
62    }
63}
64
65pub async fn toggle_slash_autocomplete(app: &mut App, session: &mut Session) {
66    set_slash_autocomplete(app, session, !app.state.slash_autocomplete).await;
67}
68
69pub fn worktree_status_message(enabled: bool) -> String {
70    format!("TUI worktree isolation: {}", on_off_label(enabled))
71}
72
73pub async fn set_use_worktree(app: &mut App, session: &mut Session, next: bool) {
74    app.state.use_worktree = next;
75    session.metadata.use_worktree = next;
76
77    match session.save().await {
78        Ok(()) => {
79            app.state.status = worktree_status_message(next);
80        }
81        Err(error) => {
82            app.state.status =
83                format!("{} (not persisted: {error})", worktree_status_message(next));
84        }
85    }
86}
87
88pub async fn toggle_selected_setting(app: &mut App, session: &mut Session) {
89    match app.state.selected_settings_index {
90        0 => set_auto_apply_edits(app, session, !app.state.auto_apply_edits).await,
91        1 => set_network_access(app, session, !app.state.allow_network).await,
92        2 => set_slash_autocomplete(app, session, !app.state.slash_autocomplete).await,
93        3 => set_use_worktree(app, session, !app.state.use_worktree).await,
94        _ => {}
95    }
96}