jetkcli 0.1.2-alpha1

A strongly opininated jira/git command line interface
Documentation
use std::collections::HashMap;

use config::{Config, ConfigError, File};

use crate::jira::Credentials;

use super::PROJECT_SETTINGS_SHARED;
use std::path::PathBuf;

#[derive(Debug, Deserialize, Serialize)]
pub struct GlobalSettings {
    pub servers: HashMap<String, Server>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct Server {
    pub url: String,
    pub username: String,
    pub password: String,
}

impl GlobalSettings {
    pub fn get() -> Result<Self, ConfigError> {
        let path = Self::path();

        if path.exists() {
            let mut s = Config::new();
            s.merge(File::from(path))?;
            s.try_into()
        } else {
            Err(ConfigError::NotFound(
                "Unable to find home directory".into(),
            ))
        }
    }

    fn path() -> PathBuf {
        let mut config_path =
            dirs::config_dir().unwrap_or_else(|| panic!("unable to locate XDG_CONFIG directory!"));
        config_path.push("jet");
        config_path.push("config.toml");
        config_path
    }
}

impl GlobalSettings {
    pub fn get_default_server_url(&self) -> &str {
        &self.servers.iter().last().unwrap().1.url
    }

    pub fn get_default_server_name(&self) -> &str {
        &self.servers.keys().last().unwrap()
    }

    pub fn get_server_url(
        &self,
        key: &str,
    ) -> Option<String> {
        self.servers.get(key).map(|server| server.url.clone())
    }

    pub fn get_credentials(
        &self,
        server_name: &str,
    ) -> Credentials {
        self.servers.get(server_name).unwrap().as_credentials()
    }

    pub fn current_credentials(&self) -> Credentials {
        let server_name = PROJECT_SETTINGS_SHARED.jira.server_name.clone();
        self.servers.get(&server_name).unwrap().as_credentials()
    }
}

impl Server {
    fn as_credentials(&self) -> Credentials {
        Credentials {
            username: self.username.clone(),
            password: self.password.clone(),
        }
    }
}