opentalk_types_common/users/
theme.rs1use 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}