packxel-utils 0.3.1

A bunch of packaging utilities
Documentation
//! ```
//! use packxel_utils::initializer::PackxelInitializer;
//! // creates the config and log directories.
//! let version = env!("CARGO_PKG_VERSION");
//! let initializer = PackxelInitializer::init("packxel", version);
//! ```

use std::path::PathBuf;

#[derive(Debug, Clone)]
pub struct PackxelInitializer {
    /// _name of the package_
    ///
    /// _creates folder of same name_
    pub name: String,
    /// _version of the package_
    ///
    /// _to be used in manifest inside config folder_
    pub version: String,
}

/// Initializer is a struct that is used to initialize
/// the config and log directories.
///
/// This can further be used to setup logging.
/// ```
/// use packxel_utils::initializer::PackxelInitializer;
/// // creates the config and log directories.
/// let version = env!("CARGO_PKG_VERSION");
/// let initializer = PackxelInitializer::init("packxel", version);
///
/// ```
impl PackxelInitializer {
    /// Returns the home directory of the user or defaults to temp dir.
    fn get_home_dir() -> PathBuf {
        dirs::home_dir().unwrap_or_else(|| PathBuf::from(std::env::temp_dir()))
    }

    /// Returns the config directory of the user or creates it if it doesn't exist.
    pub fn get_config_dir(&self) -> PathBuf {
        let mut config_dir = Self::get_home_dir();
        config_dir.push(".config");

        if !config_dir.exists() {
            std::fs::create_dir(&config_dir).unwrap();
        }

        config_dir.push(&self.name);

        if !config_dir.exists() {
            std::fs::create_dir(&config_dir).unwrap();
        }

        config_dir
    }

    /// Returns the log directory of the user or creates it if it doesn't exist.
    pub fn get_log_dir(&self) -> PathBuf {
        let mut log_dir = self.get_config_dir();
        log_dir.push("logs");

        if !log_dir.exists() {
            std::fs::create_dir(&log_dir).unwrap();
        }

        log_dir
    }

    /// This does not create the file. Only returns the path to the log file.
    ///
    /// ```
    /// use packxel_utils::initializer::PackxelInitializer;
    /// let initializer = PackxelInitializer::init("testing", "0.0.1");
    /// let log_file_path = initializer.get_log_file();
    /// ```
    pub fn get_log_file(&self) -> PathBuf {
        let mut log_file = self.get_log_dir();
        log_file.push(format!("{}.log", self.name));

        log_file
    }

    /// Initializes the Initializer struct.
    ///
    /// This should be called before logging or other utils of packxel program are initialized.
    pub fn init<S: Into<String>, R: Into<String>>(name: S, version: R) -> Self {
        let initializer = Self {
            name: name.into(),
            version: version.into(),
        };

        initializer.get_config_dir();
        initializer.get_log_dir();

        initializer
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_init() {
        let version = env!("CARGO_PKG_VERSION");
        let initializer = PackxelInitializer::init("packxel", version);
        assert_eq!(initializer.name, "packxel");
    }
}