1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
use crate::result::{Error, Result}; use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize, PartialEq)] pub enum Theme { Light, Dark } impl std::str::FromStr for Theme { type Err = Error; fn from_str(s: &str) -> Result<Self> { match s { "Light" => Ok(Theme::Light), "Dark" => Ok(Theme::Dark), _ => Err(Error::from(format!("Invalid theme [{}]", s))) } } } impl Theme { pub fn all() -> Vec<Theme> { vec![Theme::Light, Theme::Dark] } pub fn default_navbar_color(&self) -> String { match self { Theme::Light => "#263238".into(), Theme::Dark => "#263238".into() } } pub fn body_class(&self) -> &str { match self { Theme::Light => "uk-dark", Theme::Dark => "uk-light" } } pub fn card_class(&self) -> &str { match self { Theme::Light => "uk-card-default", Theme::Dark => "uk-card-secondary" } } } #[derive(Debug, Deserialize, Serialize)] pub struct UserProfile { name: String, theme: Theme, nav_color: String } impl Default for UserProfile { fn default() -> UserProfile { UserProfile { name: "Guest".into(), theme: Theme::Light, nav_color: "bluegrey".into() } } } impl UserProfile { pub fn new(name: String, theme: Theme, nav_color: String) -> UserProfile { UserProfile { name, theme, nav_color } } pub fn load(files: &crate::files::FileService, log: &slog::Logger) -> UserProfile { match files.read_json("profile") { Ok(p) => p, Err(_) => match files.write_json(UserProfile::default(), "profile") { Ok(_) => UserProfile::default(), Err(e) => { slog::warn!(log, "Unable to save default profile: {:?}", e); UserProfile::default() } } } } pub fn name(&self) -> &String { &self.name } pub fn theme(&self) -> &Theme { &self.theme } pub fn nav_color(&self) -> &String { &self.nav_color } }