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 std::env;
use std::path::PathBuf;
pub struct Configuration {
// Default Base Directories, default to XDG dirs but can be
// configured by users.
pub config_directory: PathBuf,
pub data_directory: PathBuf,
pub output_directory: PathBuf,
pub max_posts: u8,
// Derived directories: Config
pub remote_config: PathBuf,
// Derived directories: Data
pub posts_directory: PathBuf,
pub archive_directory: PathBuf,
pub static_directory: PathBuf,
pub templates_directory: PathBuf,
// Derived directories: Output
pub blog_output_directory: PathBuf,
pub archive_output_directory: PathBuf
}
impl Configuration {
pub fn new() -> Self {
let config_directory = Configuration::directory(
"BLOG_CONFIG_DIRECTORY",
"XDG_CONFIG_HOME",
".config",
"blog"
);
let data_directory = Configuration::directory(
"BLOG_DATA_DIRECTORY",
"XDG_DATA_HOME",
".local/share",
"blog"
);
let output_directory = Configuration::directory(
"BLOG_OUTPUT_DIRECTORY",
"XDG_CACHE_HOME",
".cache",
"blog"
);
let max_posts: u8 = env::var("BLOG_MAX_POSTS")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(3);
let remote_config = config_directory.join("blogremote");
let posts_directory = data_directory.join("posts");
let archive_directory = data_directory.join("archive");
let static_directory = data_directory.join("static");
let templates_directory = data_directory.join("templates");
let blog_output_directory = output_directory.join("blog");
let archive_output_directory = output_directory.join("archive");
Configuration {
config_directory,
data_directory,
output_directory,
max_posts,
remote_config,
posts_directory,
archive_directory,
static_directory,
templates_directory,
blog_output_directory,
archive_output_directory
}
}
fn directory(user_override: &str, default_value: &str, home_fallback: &str, path: &str) -> PathBuf {
match env::var(user_override) {
Ok(directory) => PathBuf::from(directory),
Err(_) => match env::var(default_value) {
Ok(directory) => PathBuf::from(directory),
Err(_) => match env::var("HOME") {
Ok(directory) => PathBuf::from(directory).join(home_fallback),
Err(_) => panic!("Could not find required directory, {} or {} should be set and readable.", user_override, default_value),
},
},
}.join(path)
}
}
|