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
|
use serde_derive::Deserialize;
use std::collections::HashMap;
use super::DEFAULT_CONFIG_FILE_PATH;
use super::{AppStyle, AppStyleRaw};
use crate::config::{parse_to_config_file, TomlConfigFile};
use crate::error::JoshutoResult;
#[derive(Clone, Debug, Deserialize, Default)]
pub struct AppThemeRaw {
#[serde(default)]
pub regular: AppStyleRaw,
#[serde(default)]
pub selection: AppStyleRaw,
#[serde(default)]
pub directory: AppStyleRaw,
#[serde(default)]
pub executable: AppStyleRaw,
#[serde(default)]
pub link: AppStyleRaw,
#[serde(default)]
pub link_invalid: AppStyleRaw,
#[serde(default)]
pub socket: AppStyleRaw,
#[serde(default)]
pub ext: HashMap<String, AppStyleRaw>,
}
impl From<AppThemeRaw> for AppTheme {
fn from(crude: AppThemeRaw) -> Self {
let selection = crude.selection.to_style_theme();
let executable = crude.executable.to_style_theme();
let regular = crude.regular.to_style_theme();
let directory = crude.directory.to_style_theme();
let link = crude.link.to_style_theme();
let link_invalid = crude.link_invalid.to_style_theme();
let socket = crude.socket.to_style_theme();
let ext: HashMap<String, AppStyle> = crude
.ext
.iter()
.map(|(k, v)| {
let style = v.to_style_theme();
(k.clone(), style)
})
.collect();
Self {
selection,
executable,
regular,
directory,
link,
link_invalid,
socket,
ext,
}
}
}
#[derive(Clone, Debug)]
pub struct AppTheme {
pub regular: AppStyle,
pub selection: AppStyle,
pub directory: AppStyle,
pub executable: AppStyle,
pub link: AppStyle,
pub link_invalid: AppStyle,
pub socket: AppStyle,
pub ext: HashMap<String, AppStyle>,
}
impl AppTheme {
pub fn default_res() -> JoshutoResult<Self> {
let crude: AppThemeRaw = toml::from_str(DEFAULT_CONFIG_FILE_PATH)?;
Ok(Self::from(crude))
}
}
impl TomlConfigFile for AppTheme {
fn get_config(file_name: &str) -> Self {
parse_to_config_file::<AppThemeRaw, AppTheme>(file_name).unwrap_or_default()
}
}
impl std::default::Default for AppTheme {
fn default() -> Self {
// This should not fail.
// If it fails then there is a (syntax) error in the default config file
Self::default_res().unwrap()
}
}
|