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}