diff --git a/Cargo.lock b/Cargo.lock index 225b2575..8aae346a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1519,6 +1519,25 @@ dependencies = [ "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "strum" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "strum_macros 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "strum_macros" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "syn" version = "0.15.44" @@ -1867,6 +1886,7 @@ dependencies = [ "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", "shellexpand 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "strum 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-process 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2270,6 +2290,8 @@ dependencies = [ "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" "checksum structopt 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ac9d6e93dd792b217bf89cda5c14566e3043960c6f9da890c2ba5d09d07804c" "checksum structopt-derive 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ae9e5165d463a0dea76967d021f8d0f9316057bf5163aa2a4843790e842ff37" +"checksum strum 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22" +"checksum strum_macros 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" "checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" "checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf" "checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" diff --git a/Cargo.toml b/Cargo.toml index 13504f8c..93d86130 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ futures = "0.1.27" openssl-probe = { version = "0.1.2", optional = true } pretty_env_logger = "0.3.0" glob = "0.3.0" +strum = { version = "0.16.0", features = ["derive"]} [target.'cfg(unix)'.dependencies] nix = "0.15.0" diff --git a/src/config.rs b/src/config.rs index 559d4dab..3f13d55d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -2,12 +2,13 @@ use super::error::{Error, ErrorKind}; use super::utils::editor; use directories::BaseDirs; use failure::ResultExt; -use lazy_static::lazy_static; +use strum::{EnumString, EnumVariantNames}; + use log::{debug, error, LevelFilter}; use pretty_env_logger::formatted_timed_builder; use serde::Deserialize; use shellexpand; -use std::collections::{BTreeMap, HashMap}; +use std::collections::BTreeMap; use std::fs::write; use std::path::PathBuf; use std::process::Command; @@ -17,30 +18,9 @@ use toml; type Commands = BTreeMap; -lazy_static! { - // While this is used to automatically generate possible value list everywhere in the code, the - // README.md file still needs to be manually updated. - static ref STEPS_MAPPING: HashMap<&'static str, Step> = { - let mut m = HashMap::new(); - - m.insert("system", Step::System); - m.insert("git-repos", Step::GitRepos); - m.insert("vim", Step::Vim); - m.insert("emacs", Step::Emacs); - m.insert("gem", Step::Gem); - m.insert("node", Step::Node); - m.insert("sdkman", Step::Sdkman); - m.insert("remotes", Step::Remotes); - m.insert("rustup", Step::Rustup); - m.insert("cargo", Step::Cargo); - m.insert("shell", Step::Shell); - - m - }; -} - -#[derive(Debug, Clone, PartialEq, Deserialize)] +#[derive(EnumString, EnumVariantNames, Debug, Clone, PartialEq, Deserialize)] #[serde(rename_all = "lowercase")] +#[strum(serialize_all = "snake_case")] pub enum Step { /// Don't perform system upgrade System, @@ -66,19 +46,6 @@ pub enum Step { Shell, } -impl Step { - fn possible_values() -> Vec<&'static str> { - STEPS_MAPPING.keys().cloned().collect() - } -} - -impl std::str::FromStr for Step { - type Err = structopt::clap::Error; - fn from_str(s: &str) -> Result { - Ok(STEPS_MAPPING.get(s).unwrap().clone()) - } -} - #[derive(Deserialize, Default, Debug)] #[serde(deny_unknown_fields)] /// Configuration file @@ -171,7 +138,7 @@ pub struct CommandLineArgs { no_retry: bool, /// Do not perform upgrades for the given steps - #[structopt(long = "disable", possible_values = &Step::possible_values())] + #[structopt(long = "disable", possible_values = &Step::variants())] disable: Vec, /// Output logs