diff --git a/Cargo.lock b/Cargo.lock index cd79253..0eb00b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -976,6 +976,7 @@ dependencies = [ "lexical-sort", "libcosmic", "log", + "paste", "rust-embed", "serde", "systemicons", diff --git a/Cargo.toml b/Cargo.toml index b934726..6361846 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ env_logger = "0.10" lazy_static = "1" lexical-sort = "0.3.1" log = "0.4" +paste = "1.0" serde = { version = "1", features = ["serde_derive"] } tokio = { version = "1" } trash = "3.2.0" diff --git a/src/main.rs b/src/main.rs index e5ddd20..2e2d7ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -416,13 +416,40 @@ impl Application for App { /// Handle application events here. fn update(&mut self, message: Self::Message) -> Command { + // Helper for updating config values efficiently + macro_rules! config_set { + ($name: ident, $value: expr) => { + match &self.config_handler { + Some(config_handler) => { + match paste::paste! { self.config.[](config_handler, $value) } { + Ok(_) => {} + Err(err) => { + log::warn!( + "failed to save config {:?}: {}", + stringify!($name), + err + ); + } + } + } + None => { + self.config.$name = $value; + log::warn!( + "failed to save config {:?}: no config handler", + stringify!($name) + ); + } + } + }; + } + match message { Message::Todo => { log::warn!("TODO"); } Message::AppTheme(app_theme) => { - self.config.app_theme = app_theme; - return self.save_config(); + config_set!(app_theme, app_theme); + return self.update_config(); } Message::Config(config) => { if config != self.config {