diff options
Diffstat (limited to 'src/config')
| -rw-r--r-- | src/config/io.rs | 42 | ||||
| -rw-r--r-- | src/config/keybinds.rs | 50 | ||||
| -rw-r--r-- | src/config/model.rs | 17 |
3 files changed, 75 insertions, 34 deletions
diff --git a/src/config/io.rs b/src/config/io.rs index 1a3c1920..2774fc93 100644 --- a/src/config/io.rs +++ b/src/config/io.rs @@ -2,7 +2,7 @@ use std::path::{Path, PathBuf}; use tracing::warn; -use super::{model::LoadedConfig, Config, LiveKeybindConfig, CONFIG_PATH_ENV_VAR}; +use super::{model::LoadedConfig, Config, CONFIG_PATH_ENV_VAR}; pub fn app_dir_name() -> &'static str { if cfg!(debug_assertions) { @@ -77,23 +77,37 @@ pub fn config_path() -> PathBuf { config_dir().join("config.toml") } -pub fn load_live_keybinds() -> Result<LiveKeybindConfig, Vec<String>> { +pub fn config_diagnostic_summary(diagnostics: &[String]) -> Option<String> { + if diagnostics.is_empty() { + None + } else if diagnostics.len() == 1 { + Some(diagnostics[0].clone()) + } else { + Some(format!( + "{} (and {} more)", + diagnostics[0], + diagnostics.len() - 1 + )) + } +} + +pub fn load_live_config() -> Result<LoadedConfig, Vec<String>> { let path = config_path(); if !path.exists() { - return Config::default().live_keybinds(); + return Ok(LoadedConfig { + config: Config::default(), + diagnostics: Vec::new(), + }); } - let content = std::fs::read_to_string(&path).map_err(|err| { - vec![format!( - "config read error: {err}; keeping current keybinds" - )] - })?; - let config = toml::from_str::<Config>(&content).map_err(|err| { - vec![format!( - "config parse error: {err}; keeping current keybinds" - )] - })?; - config.live_keybinds() + let content = std::fs::read_to_string(&path) + .map_err(|err| vec![format!("config read error: {err}; keeping current config")])?; + let config = toml::from_str::<Config>(&content) + .map_err(|err| vec![format!("config parse error: {err}; keeping current config")])?; + Ok(LoadedConfig { + config, + diagnostics: Vec::new(), + }) } pub(crate) fn upsert_top_level_bool(content: &str, key: &str, value: bool) -> String { diff --git a/src/config/keybinds.rs b/src/config/keybinds.rs index 07c682ba..4a54dd74 100644 --- a/src/config/keybinds.rs +++ b/src/config/keybinds.rs @@ -65,6 +65,8 @@ pub struct Keybinds { pub close_workspace_label: String, pub detach: Option<(KeyCode, KeyModifiers)>, pub detach_label: Option<String>, + pub reload_config: Option<(KeyCode, KeyModifiers)>, + pub reload_config_label: Option<String>, pub previous_workspace: Option<(KeyCode, KeyModifiers)>, pub previous_workspace_label: Option<String>, pub next_workspace: Option<(KeyCode, KeyModifiers)>, @@ -337,6 +339,12 @@ impl Config { ), optional_binding( BindingScope::Navigate, + "keys.reload_config", + &self.keys.reload_config, + &mut diagnostics, + ), + optional_binding( + BindingScope::Navigate, "keys.previous_workspace", &self.keys.previous_workspace, &mut diagnostics, @@ -578,28 +586,30 @@ impl Config { close_workspace_label: bindings[2].label.clone(), detach: optional_bindings[0].value, detach_label: optional_bindings[0].label.clone(), - previous_workspace: optional_bindings[1].value, - previous_workspace_label: optional_bindings[1].label.clone(), - next_workspace: optional_bindings[2].value, - next_workspace_label: optional_bindings[2].label.clone(), + reload_config: optional_bindings[1].value, + reload_config_label: optional_bindings[1].label.clone(), + previous_workspace: optional_bindings[2].value, + previous_workspace_label: optional_bindings[2].label.clone(), + next_workspace: optional_bindings[3].value, + next_workspace_label: optional_bindings[3].label.clone(), new_tab: bindings[3].value, new_tab_label: bindings[3].label.clone(), - rename_tab: optional_bindings[3].value, - rename_tab_label: optional_bindings[3].label.clone(), - previous_tab: optional_bindings[4].value, - previous_tab_label: optional_bindings[4].label.clone(), - next_tab: optional_bindings[5].value, - next_tab_label: optional_bindings[5].label.clone(), - close_tab: optional_bindings[6].value, - close_tab_label: optional_bindings[6].label.clone(), - focus_pane_left: optional_bindings[7].value, - focus_pane_left_label: optional_bindings[7].label.clone(), - focus_pane_down: optional_bindings[8].value, - focus_pane_down_label: optional_bindings[8].label.clone(), - focus_pane_up: optional_bindings[9].value, - focus_pane_up_label: optional_bindings[9].label.clone(), - focus_pane_right: optional_bindings[10].value, - focus_pane_right_label: optional_bindings[10].label.clone(), + rename_tab: optional_bindings[4].value, + rename_tab_label: optional_bindings[4].label.clone(), + previous_tab: optional_bindings[5].value, + previous_tab_label: optional_bindings[5].label.clone(), + next_tab: optional_bindings[6].value, + next_tab_label: optional_bindings[6].label.clone(), + close_tab: optional_bindings[7].value, + close_tab_label: optional_bindings[7].label.clone(), + focus_pane_left: optional_bindings[8].value, + focus_pane_left_label: optional_bindings[8].label.clone(), + focus_pane_down: optional_bindings[9].value, + focus_pane_down_label: optional_bindings[9].label.clone(), + focus_pane_up: optional_bindings[10].value, + focus_pane_up_label: optional_bindings[10].label.clone(), + focus_pane_right: optional_bindings[11].value, + focus_pane_right_label: optional_bindings[11].label.clone(), split_vertical: bindings[4].value, split_vertical_label: bindings[4].label.clone(), split_horizontal: bindings[5].value, diff --git a/src/config/model.rs b/src/config/model.rs index e2c39f25..32d60493 100644 --- a/src/config/model.rs +++ b/src/config/model.rs @@ -16,6 +16,20 @@ pub struct ToastConfig { pub delivery: ToastDelivery, } +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)] +#[serde(rename_all = "snake_case")] +pub enum ConfigReloadStatus { + Applied, + Partial, + Failed, +} + +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] +pub struct ConfigReloadReport { + pub status: ConfigReloadStatus, + pub diagnostics: Vec<String>, +} + #[derive(Debug, Default, Deserialize)] #[serde(default)] pub struct Config { @@ -45,6 +59,8 @@ pub struct KeysConfig { pub close_workspace: String, /// Optional explicit detach shortcut in server/client mode. Unset by default. pub detach: String, + /// Reload config.toml in the running app/server. Unset by default. + pub reload_config: String, /// Select the previous workspace. Unset by default. pub previous_workspace: String, /// Select the next workspace. Unset by default. @@ -116,6 +132,7 @@ impl Default for KeysConfig { rename_workspace: "shift+n".into(), close_workspace: "shift+d".into(), detach: "".into(), + reload_config: "".into(), previous_workspace: "".into(), next_workspace: "".into(), new_tab: "c".into(), |
