i3status_rs/themes/
separator.rs

1use crate::errors::*;
2use serde::Deserialize;
3use serde::de::{self, Deserializer, Visitor};
4use smart_default::SmartDefault;
5use std::fmt;
6use std::str::FromStr;
7
8#[derive(Debug, Clone, PartialEq, Eq, SmartDefault)]
9pub enum Separator {
10    #[default]
11    Native,
12    Custom(String),
13}
14
15impl FromStr for Separator {
16    type Err = Error;
17
18    fn from_str(separator: &str) -> Result<Self, Self::Err> {
19        Ok(if separator == "native" {
20            Self::Native
21        } else {
22            Self::Custom(separator.into())
23        })
24    }
25}
26
27impl<'de> Deserialize<'de> for Separator {
28    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
29    where
30        D: Deserializer<'de>,
31    {
32        struct SeparatorVisitor;
33
34        impl Visitor<'_> for SeparatorVisitor {
35            type Value = Separator;
36
37            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
38                formatter.write_str("a separator string or 'native'")
39            }
40
41            fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
42            where
43                E: de::Error,
44            {
45                s.parse().serde_error()
46            }
47        }
48
49        deserializer.deserialize_any(SeparatorVisitor)
50    }
51}