From 44ace0edbf9d6cd440c09f96b0eb0b7d141ac779 Mon Sep 17 00:00:00 2001 From: Michael Gattozzi Date: Tue, 10 Dec 2019 17:04:58 -0500 Subject: Create configamajig to handle dev-suite configs Configuaration is important and overtime dev-suite will need more and more of it. This commit adds the configamajig crate to handle these configs and have it shared across tools that need access to them, creating one API not several bits of glue code to read in files. --- Cargo.lock | 13 +++++ Cargo.toml | 1 + configamajig/Cargo.toml | 15 +++++ configamajig/src/lib.rs | 150 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 179 insertions(+) create mode 100644 configamajig/Cargo.toml create mode 100644 configamajig/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 3199d7a..5441bb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -184,6 +184,18 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "configamajig" +version = "0.1.0" +dependencies = [ + "anyhow 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", + "shared 0.1.0", + "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "console" version = "0.9.1" @@ -1048,6 +1060,7 @@ name = "uuid" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/Cargo.toml b/Cargo.toml index 948d163..e65a7bd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ which = "3.1" [workspace] members = [ + "configamajig", "shared", "ticket", "hooked", diff --git a/configamajig/Cargo.toml b/configamajig/Cargo.toml new file mode 100644 index 0000000..d18072d --- /dev/null +++ b/configamajig/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "configamajig" +version = "0.1.0" +authors = ["Michael Gattozzi "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0" +dirs = "2.0" +toml = "0.5" +shared = { path = "../shared" } +serde = { version = "1.0", features = ["derive"] } +uuid = { version = "0.8", features = ["serde", "v4"] } diff --git a/configamajig/src/lib.rs b/configamajig/src/lib.rs new file mode 100644 index 0000000..6585be6 --- /dev/null +++ b/configamajig/src/lib.rs @@ -0,0 +1,150 @@ +//! config management lib for dev-suite +use anyhow::{ + format_err, + Result, +}; +use dirs::config_dir; +use serde::{ + Deserialize, + Serialize, +}; +use shared::find_root; +use std::{ + fs, + path::PathBuf, +}; +use uuid::Uuid; + +/// Creates a new user config if it does not exist +pub fn create_user_config(name: impl Into) -> Result<()> { + let conf_dir = config_dir() + .ok_or_else(|| format_err!("Unable to get the config dir for the OS"))? + .join("dev-suite"); + if !conf_dir.exists() { + fs::create_dir_all(&conf_dir)?; + } + let conf_path = conf_dir.join("user-config.toml"); + if !conf_path.exists() { + let user_config = UserConfig::new(name); + fs::write(&conf_path, toml::to_string_pretty(&user_config)?)?; + } + Ok(()) +} + +/// Creates a new repo config if it does not exist +pub fn create_repo_config() -> Result<()> { + let conf_dir = find_root()?.join(".dev-suite"); + if !conf_dir.exists() { + fs::create_dir_all(&conf_dir)?; + } + let conf_path = conf_dir.join("repo-config.toml"); + if !conf_path.exists() { + let repo_config = RepoConfig::new(); + fs::write(&conf_path, toml::to_string_pretty(&repo_config)?)?; + } + Ok(()) +} + +/// Get the path for the user config +fn user_config_path() -> Result { + Ok( + config_dir() + .ok_or_else(|| format_err!("Unable to get the config dir for the OS"))? + .join("dev-suite") + .join("user-config.toml"), + ) +} + +/// Get the path for the repo config +fn repo_config_path() -> Result { + Ok(find_root()?.join(".dev-suite").join("repo-config.toml")) +} + +/// Reads in the user config +pub fn get_user_config() -> Result { + Ok(toml::from_slice(&fs::read(&user_config_path()?)?)?) +} +/// Reads in the repo config +pub fn get_repo_config() -> Result { + Ok(toml::from_slice(&fs::read(&repo_config_path()?)?)?) +} + +/// Writes the user config to disk +// We don't want the user to use the old value again +#[allow(clippy::needless_pass_by_value)] +pub fn set_user_config(user_config: UserConfig) -> Result<()> { + fs::write(&user_config_path()?, toml::to_string_pretty(&user_config)?)?; + Ok(()) +} + +/// Writes the user config to disk +// We don't want the user to use the old value again +#[allow(clippy::needless_pass_by_value)] +pub fn set_repo_config(repo_config: RepoConfig) -> Result<()> { + fs::write(&repo_config_path()?, toml::to_string_pretty(&repo_config)?)?; + Ok(()) +} + +/// User Config struct +#[derive(Serialize, Deserialize, Debug)] +pub struct UserConfig { + name: String, + uuid: Uuid, +} + +impl UserConfig { + /// Create a new UserConfig from a given name and assign UUID to them + pub fn new(name: impl Into) -> Self { + Self { + name: name.into(), + uuid: Uuid::new_v4(), + } + } +} + +/// Repo Config struct +#[derive(Serialize, Deserialize, Debug, Default)] +pub struct RepoConfig { + maintainers: Vec<(String, Uuid)>, +} + +impl RepoConfig { + /// Create a new RepoConfig + pub fn new() -> Self { + Self { + maintainers: Vec::new(), + } + } +} + +/// Show repo config +pub fn show_repo_config() -> Result<()> { + let conf = get_repo_config()?; + for m in conf.maintainers { + println!("{} - {}", m.0, m.1); + } + Ok(()) +} + +/// Show repo config +pub fn show_user_config() -> Result<()> { + let conf = get_user_config()?; + println!("{} - {}", conf.name, conf.uuid); + Ok(()) +} + +/// Add current user to this repo's list of maintainers +pub fn add_self_to_maintainers() -> Result<()> { + let mut repo_conf = get_repo_config()?; + let user_conf = get_user_config()?; + if repo_conf + .maintainers + .iter() + .any(|x| x.0 == user_conf.name && x.1 == user_conf.uuid) + { + Ok(()) + } else { + repo_conf.maintainers.push((user_conf.name, user_conf.uuid)); + set_repo_config(repo_conf) + } +} -- cgit v1.2.3