diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-22 17:01:25 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-22 17:01:25 +0300 |
| commit | 4b482f37a1e233b9aca6bf99b12e8b4da3e5c05e (patch) | |
| tree | 69d1a56ad6335547eec9727691310cf96ebe9623 /src/config/model.rs | |
| parent | 5bd939fbfc92a8073d0eac11dfb02a31ea638b15 (diff) | |
feat: add terminal-delivered client notifications
Diffstat (limited to 'src/config/model.rs')
| -rw-r--r-- | src/config/model.rs | 75 |
1 files changed, 69 insertions, 6 deletions
diff --git a/src/config/model.rs b/src/config/model.rs index 70eede5a..e2c39f25 100644 --- a/src/config/model.rs +++ b/src/config/model.rs @@ -1,11 +1,19 @@ -use serde::Deserialize; +use serde::{Deserialize, Deserializer, Serialize}; use super::{CommandKeybindConfig, SoundConfig, ThemeConfig, DEFAULT_SCROLLBACK_LIMIT_BYTES}; -#[derive(Debug, Clone, Deserialize)] -#[serde(default)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default)] +#[serde(rename_all = "lowercase")] +pub enum ToastDelivery { + #[default] + Off, + Herdr, + Terminal, +} + +#[derive(Debug, Clone)] pub struct ToastConfig { - pub enabled: bool, + pub delivery: ToastDelivery, } #[derive(Debug, Default, Deserialize)] @@ -144,7 +152,31 @@ impl Default for UiConfig { impl Default for ToastConfig { fn default() -> Self { - Self { enabled: false } + Self { + delivery: ToastDelivery::Off, + } + } +} + +impl<'de> Deserialize<'de> for ToastConfig { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + #[derive(Deserialize, Default)] + #[serde(default)] + struct RawToastConfig { + delivery: Option<ToastDelivery>, + enabled: Option<bool>, + } + + let raw = RawToastConfig::deserialize(deserializer)?; + let delivery = raw.delivery.unwrap_or_else(|| match raw.enabled { + Some(true) => ToastDelivery::Herdr, + Some(false) => ToastDelivery::Off, + None => ToastDelivery::Off, + }); + Ok(Self { delivery }) } } @@ -165,10 +197,41 @@ mod tests { fn toast_config_parses() { let toml = r#" [ui.toast] +delivery = "terminal" +"#; + let config: Config = toml::from_str(toml).unwrap(); + assert_eq!(config.ui.toast.delivery, ToastDelivery::Terminal); + } + + #[test] + fn toast_config_legacy_enabled_true_maps_to_herdr() { + let toml = r#" +[ui.toast] +enabled = true +"#; + let config: Config = toml::from_str(toml).unwrap(); + assert_eq!(config.ui.toast.delivery, ToastDelivery::Herdr); + } + + #[test] + fn toast_config_legacy_enabled_false_maps_to_off() { + let toml = r#" +[ui.toast] +enabled = false +"#; + let config: Config = toml::from_str(toml).unwrap(); + assert_eq!(config.ui.toast.delivery, ToastDelivery::Off); + } + + #[test] + fn toast_config_delivery_wins_over_legacy_enabled() { + let toml = r#" +[ui.toast] enabled = true +delivery = "terminal" "#; let config: Config = toml::from_str(toml).unwrap(); - assert!(config.ui.toast.enabled); + assert_eq!(config.ui.toast.delivery, ToastDelivery::Terminal); } #[test] |
