Use STRUM for agument parsing
This commit is contained in:
22
Cargo.lock
generated
22
Cargo.lock
generated
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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<String, String>;
|
||||
|
||||
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<Self, Self::Err> {
|
||||
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<Step>,
|
||||
|
||||
/// Output logs
|
||||
|
||||
Reference in New Issue
Block a user