robe 0.0.8

Wear your configs: a tiny CLI for saving and switching between dotfile configurations
use serde::Deserialize;
use std::path::PathBuf;

#[derive(Debug, Clone, Deserialize, PartialEq)]
pub struct Settings {
    pub wardrobe: String,
}

impl Default for Settings {
    fn default() -> Self {
        Self {
            wardrobe: default_data_location(),
        }
    }
}

fn default_data_location() -> String {
    dirs::data_local_dir()
        .map(|mut p| {
            p.push("robe");
            p
        })
        .unwrap_or_else(|| PathBuf::from("$HOME/.local/share/robe/wardrobe"))
        .to_string_lossy()
        .to_string()
}

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

    #[test]
    fn test_default_settings() {
        let s = Settings::default();

        assert!(!s.wardrobe.is_empty());
        assert!(s.wardrobe.contains("robe"));
    }

    #[test]
    fn test_deserialize_settings() {
        let toml = r#"
wardrobe = "/tmp/my-robe"
"#;

        let settings: Settings = toml::from_str(toml).unwrap();

        assert_eq!(settings.wardrobe, "/tmp/my-robe");
    }

    #[test]
    fn test_deserialize_equals_struct() {
        let toml = r#"
wardrobe = "/tmp/test"
"#;

        let parsed: Settings = toml::from_str(toml).unwrap();

        let expected = Settings {
            wardrobe: "/tmp/test".to_string(),
        };

        assert_eq!(parsed, expected);
    }

    #[test]
    fn test_default_data_location_contains_robe() {
        let path = default_data_location();
        assert!(path.contains("robe"));
    }
}