i3status_rs/themes/
separator.rs1use 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}