aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--swaystatus/src/config/custom_deserializers.rs10
-rw-r--r--swaystatus/src/config/mod.rs24
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()
}