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
97
98
use crate::{Error, Result};

use serde::{Deserialize, Serialize};

#[derive(Clone, 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(Clone, Debug, Deserialize, Serialize)]
pub struct UserProfile {
  name: String,
  theme: Theme,
  nav_color: String,
  link_color: String
}

impl Default for UserProfile {
  fn default() -> UserProfile {
    UserProfile {
      name: "Guest".into(),
      theme: Theme::Light,
      nav_color: "bluegrey".into(),
      link_color: "bluegrey".into()
    }
  }
}

impl UserProfile {
  pub fn new(name: String, theme: Theme, nav_color: String, link_color: String) -> UserProfile {
    UserProfile {
      name,
      theme,
      nav_color,
      link_color
    }
  }

  pub fn name(&self) -> &String {
    &self.name
  }

  pub fn theme(&self) -> &Theme {
    &self.theme
  }

  pub fn nav_color(&self) -> &String {
    &self.nav_color
  }

  pub fn link_color(&self) -> &String {
    &self.link_color
  }

  pub fn link_class(&self) -> String {
    format!("{}-fg", &self.link_color)
  }
}