Skip to main content

opentalk_types_common/users/
theme.rs

1// SPDX-FileCopyrightText: OpenTalk GmbH <mail@opentalk.eu>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5use std::str::FromStr;
6
7use crate::{sql_enum, utils::ExampleData};
8sql_enum!(
9    feature_gated:
10
11    #[derive(PartialEq, Eq, PartialOrd, Ord, Hash)]
12    #[cfg_attr(
13        feature = "serde",
14        derive(serde::Serialize, serde::Deserialize),
15        serde(rename_all = "snake_case")
16    )]
17    #[cfg_attr(
18        feature = "utoipa",
19        derive(utoipa::ToSchema),
20        schema(example = json!(Theme::example_data()))
21    )]
22    Theme,
23    "theme",
24    ThemeType,
25    {
26        Light = b"light",
27        Dark = b"dark",
28        System = b"system",
29    }
30);
31
32impl ExampleData for Theme {
33    fn example_data() -> Self {
34        Self::System
35    }
36}
37
38impl FromStr for Theme {
39    type Err = String;
40
41    fn from_str(s: &str) -> Result<Self, Self::Err> {
42        match s.to_lowercase().as_str() {
43            "light" => Ok(Self::Light),
44            "dark" => Ok(Self::Dark),
45            "system" => Ok(Self::System),
46            _ => Err(format!("unknown theme {s:?}")),
47        }
48    }
49}
50
51impl std::fmt::Display for Theme {
52    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
53        f.write_str(match self {
54            Theme::Light => "light",
55            Theme::Dark => "dark",
56            Theme::System => "system",
57        })
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use pretty_assertions::assert_eq;
64
65    use super::Theme;
66
67    #[test]
68    fn parse_valid() {
69        assert_eq!("light".parse::<Theme>().unwrap(), Theme::Light);
70        assert_eq!("LIGHT".parse::<Theme>().unwrap(), Theme::Light);
71        assert_eq!("dark".parse::<Theme>().unwrap(), Theme::Dark);
72        assert_eq!("system".parse::<Theme>().unwrap(), Theme::System);
73    }
74
75    #[test]
76    fn parse_invalid() {
77        assert!("unknown".parse::<Theme>().is_err());
78    }
79
80    #[test]
81    fn display() {
82        assert_eq!(Theme::Light.to_string(), "light");
83        assert_eq!(Theme::Dark.to_string(), "dark");
84        assert_eq!(Theme::System.to_string(), "system");
85    }
86}