use dirs;
use serde::{Deserialize, Serialize};
use std::env;
use std::fs;
use toml;
use crate::errors::SetGitConfigError;
const SETGITCONFIG_CONF: &str = "SETGITCONFIG_CONF";
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct RepositoryMap {
pub email: String,
pub username: String,
pub giturl: String,
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct Configuration {
pub repositories: Vec<RepositoryMap>,
}
pub fn read() -> Result<Configuration, SetGitConfigError> {
let path_to_config = match env::var(SETGITCONFIG_CONF) {
Ok(val) => val,
Err(_) => {
let config_dir = dirs::config_dir().expect("Please create ~/.config directory");
let pathconf = config_dir.join("setgitconfig").join("config.toml");
pathconf.to_str().unwrap().to_owned()
}
};
let content = fs::read_to_string(path_to_config)?;
let configuration: Configuration = toml::from_str(&content)?;
Ok(configuration)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config() {
let toml_str = r#"
[[repositories]]
username= "Hakuna Matata"
email = "hakunamatata@gmail.com"
giturl = "github.com"
"#;
let decoded: Configuration = toml::from_str(toml_str).unwrap();
for conf in decoded.repositories {
assert_eq!(conf.email, "hakunamatata@gmail.com");
assert_eq!(conf.giturl, "github.com");
assert_eq!(conf.username, "Hakuna Matata");
}
}
}