aboutsummaryrefslogtreecommitdiff
path: root/src/config
diff options
context:
space:
mode:
Diffstat (limited to 'src/config')
-rw-r--r--src/config/io.rs42
-rw-r--r--src/config/keybinds.rs50
-rw-r--r--src/config/model.rs17
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(),