packxel_utils/initializer/mod.rs
1//! ```
2//! use packxel_utils::initializer::PackxelInitializer;
3//! // creates the config and log directories.
4//! let version = env!("CARGO_PKG_VERSION");
5//! let initializer = PackxelInitializer::init("packxel", version);
6//! ```
7
8use std::path::PathBuf;
9
10#[derive(Debug, Clone)]
11pub struct PackxelInitializer {
12 /// _name of the package_
13 ///
14 /// _creates folder of same name_
15 pub name: String,
16 /// _version of the package_
17 ///
18 /// _to be used in manifest inside config folder_
19 pub version: String,
20}
21
22/// Initializer is a struct that is used to initialize
23/// the config and log directories.
24///
25/// This can further be used to setup logging.
26/// ```
27/// use packxel_utils::initializer::PackxelInitializer;
28/// // creates the config and log directories.
29/// let version = env!("CARGO_PKG_VERSION");
30/// let initializer = PackxelInitializer::init("packxel", version);
31///
32/// ```
33impl PackxelInitializer {
34 /// Returns the home directory of the user or defaults to temp dir.
35 fn get_home_dir() -> PathBuf {
36 dirs::home_dir().unwrap_or_else(|| PathBuf::from(std::env::temp_dir()))
37 }
38
39 /// Returns the config directory of the user or creates it if it doesn't exist.
40 pub fn get_config_dir(&self) -> PathBuf {
41 let mut config_dir = Self::get_home_dir();
42 config_dir.push(".config");
43
44 if !config_dir.exists() {
45 std::fs::create_dir(&config_dir).unwrap();
46 }
47
48 config_dir.push(&self.name);
49
50 if !config_dir.exists() {
51 std::fs::create_dir(&config_dir).unwrap();
52 }
53
54 config_dir
55 }
56
57 /// Returns the log directory of the user or creates it if it doesn't exist.
58 pub fn get_log_dir(&self) -> PathBuf {
59 let mut log_dir = self.get_config_dir();
60 log_dir.push("logs");
61
62 if !log_dir.exists() {
63 std::fs::create_dir(&log_dir).unwrap();
64 }
65
66 log_dir
67 }
68
69 /// This does not create the file. Only returns the path to the log file.
70 ///
71 /// ```
72 /// use packxel_utils::initializer::PackxelInitializer;
73 /// let initializer = PackxelInitializer::init("testing", "0.0.1");
74 /// let log_file_path = initializer.get_log_file();
75 /// ```
76 pub fn get_log_file(&self) -> PathBuf {
77 let mut log_file = self.get_log_dir();
78 log_file.push(format!("{}.log", self.name));
79
80 log_file
81 }
82
83 /// Initializes the Initializer struct.
84 ///
85 /// This should be called before logging or other utils of packxel program are initialized.
86 pub fn init<S: Into<String>, R: Into<String>>(name: S, version: R) -> Self {
87 let initializer = Self {
88 name: name.into(),
89 version: version.into(),
90 };
91
92 initializer.get_config_dir();
93 initializer.get_log_dir();
94
95 initializer
96 }
97}
98
99#[cfg(test)]
100mod tests {
101 use super::*;
102
103 #[test]
104 fn test_init() {
105 let version = env!("CARGO_PKG_VERSION");
106 let initializer = PackxelInitializer::init("packxel", version);
107 assert_eq!(initializer.name, "packxel");
108 }
109}