diff options
| -rw-r--r-- | swaystatus/src/config/custom_deserializers.rs | 10 | ||||
| -rw-r--r-- | swaystatus/src/config/mod.rs | 24 |
2 files changed, 32 insertions, 2 deletions
diff --git a/swaystatus/src/config/custom_deserializers.rs b/swaystatus/src/config/custom_deserializers.rs index 3a7599a..cf468ca 100644 --- a/swaystatus/src/config/custom_deserializers.rs +++ b/swaystatus/src/config/custom_deserializers.rs @@ -113,7 +113,7 @@ impl<'de, 'a, 'b> DeserializeSeed<'de> for PluginConfigDeserializeSeed<'a, 'b> { #[derive(Deserialize)] #[serde(field_identifier)] #[allow(non_camel_case_types)] -enum PluginConfigField { Plugin, Config, plugin, config } +enum PluginConfigField { Plugin, Config, plugin, config, General, general } struct PluginConfigVisitor<'a>(&'a PluginDatabase<'a>); impl<'de, 'a> Visitor<'de> for PluginConfigVisitor<'a> { type Value = SwaystatusPluginConfig<'a>; @@ -125,6 +125,7 @@ impl<'de, 'a> Visitor<'de> for PluginConfigVisitor<'a> { where V: MapAccess<'de>, { let mut plug = None; let mut conf = None; + let mut gen = None; while let Some(key) = map.next_key()? { match key { PluginConfigField::Plugin | PluginConfigField::plugin => { @@ -144,9 +145,16 @@ impl<'de, 'a> Visitor<'de> for PluginConfigVisitor<'a> { return Err(de::Error::missing_field("Plugin")); } } + PluginConfigField::General | PluginConfigField::general => { + if gen.is_some() { + return Err(de::Error::duplicate_field("General")); + } + gen = Some(map.next_value()?); + } } } Ok(SwaystatusPluginConfig{ + general : gen.unwrap_or_default(), plugin: plug.ok_or_else(|| de::Error::missing_field("Plugin"))?, config : conf.ok_or_else(|| de::Error::missing_field("Config"))? }) diff --git a/swaystatus/src/config/mod.rs b/swaystatus/src/config/mod.rs index 2ea27f8..c851a25 100644 --- a/swaystatus/src/config/mod.rs +++ b/swaystatus/src/config/mod.rs @@ -44,7 +44,28 @@ pub struct SwaystatusPluginConfig<'p> { #[serde(rename = "Plugin")] plugin : String, #[serde(rename = "Config")] - config : Box<dyn plugin::SwayStatusModuleInstance + 'p> + config : Box<dyn plugin::SwayStatusModuleInstance + 'p>, + #[serde(rename = "General")] + general : SwaystatusElementNonPluginOptions +} + +/** + * Struct containing the per-element options that are not plugin-specific. + */ +#[derive(Serialize, Deserialize)] +#[serde(deny_unknown_fields, default, rename_all="PascalCase")] +pub struct SwaystatusElementNonPluginOptions { + pub before_text : String, + pub after_text : String +} + +impl Default for SwaystatusElementNonPluginOptions { + fn default() -> Self { + SwaystatusElementNonPluginOptions{ + before_text : String::new(), + after_text : String::new() + } + } } impl<'p> SwaystatusConfig<'p> { @@ -64,6 +85,7 @@ impl<'p> SwaystatusConfig<'p> { let v : Vec<SwaystatusPluginConfig> = plugins.get_name_and_plugin_iterator().map(|(name, object)| { SwaystatusPluginConfig{ + general : SwaystatusElementNonPluginOptions::default(), plugin : name.clone(), config : object.get_default_config() } |
