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 = "bincode",
14        derive(bincode::Encode, bincode::Decode),
15    )]
16    #[cfg_attr(
17        feature = "serde",
18        derive(serde::Serialize, serde::Deserialize),
19        serde(rename_all = "snake_case")
20    )]
21    #[cfg_attr(
22        feature = "utoipa",
23        derive(utoipa::ToSchema),
24        schema(example = json!(Theme::example_data()))
25    )]
26    Theme,
27    "theme",
28    ThemeType,
29    {
30        Light = b"light",
31        Dark = b"dark",
32        System = b"system",
33    }
34);
35
36impl ExampleData for Theme {
37    fn example_data() -> Self {
38        Self::System
39    }
40}
41
42impl FromStr for Theme {
43    type Err = String;
44
45    fn from_str(s: &str) -> Result<Self, Self::Err> {
46        match s.to_lowercase().as_str() {
47            "light" => Ok(Self::Light),
48            "dark" => Ok(Self::Dark),
49            "system" => Ok(Self::System),
50            _ => Err(format!("unknown theme {s:?}")),
51        }
52    }
53}
54
55impl std::fmt::Display for Theme {
56    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
57        f.write_str(match self {
58            Theme::Light => "light",
59            Theme::Dark => "dark",
60            Theme::System => "system",
61        })
62    }
63}
64
65#[cfg(test)]
66mod tests {
67    use pretty_assertions::assert_eq;
68
69    use super::Theme;
70
71    #[test]
72    fn parse_valid() {
73        assert_eq!("light".parse::<Theme>().unwrap(), Theme::Light);
74        assert_eq!("LIGHT".parse::<Theme>().unwrap(), Theme::Light);
75        assert_eq!("dark".parse::<Theme>().unwrap(), Theme::Dark);
76        assert_eq!("system".parse::<Theme>().unwrap(), Theme::System);
77    }
78
79    #[test]
80    fn parse_invalid() {
81        assert!("unknown".parse::<Theme>().is_err());
82    }
83
84    #[test]
85    fn display() {
86        assert_eq!(Theme::Light.to_string(), "light");
87        assert_eq!(Theme::Dark.to_string(), "dark");
88        assert_eq!(Theme::System.to_string(), "system");
89    }
90}