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 = "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}