Move some arg parsing to ArgMatchesExt
authorAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 10 Mar 2018 13:39:39 +0000 (16:39 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 10 Mar 2018 13:39:39 +0000 (16:39 +0300)
src/bin/cli.rs
src/bin/command_prelude.rs

index b2bd8ec8fa28f06e6a198bbe7aee939e7f3c7067..46b4f4754c9087aeeaca2b292af52c02e8ce63b3 100644 (file)
@@ -84,7 +84,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
 
     match args.subcommand() {
         ("bench", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             let mut compile_opts = compile_options_from_args(config, args, CompileMode::Bench)?;
             compile_opts.release = true;
 
@@ -111,7 +111,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             }
         }
         ("build", Some(args)) => {
-            let mut ws = workspace_from_args(config, args)?;
+            let mut ws = args.workspace(config)?;
             if config.cli_unstable().avoid_dev_deps {
                 ws.set_require_optional_deps(false);
             }
@@ -120,7 +120,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("check", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             let test = match args.value_of("profile") {
                 Some("test") => true,
                 None => false,
@@ -136,7 +136,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("clean", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             let opts = ops::CleanOptions {
                 config,
                 spec: values(args, "package"),
@@ -147,7 +147,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("doc", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             let mode = ops::CompileMode::Doc { deps: !args.is_present("no-deps") };
             let compile_opts = compile_options_from_args(config, args, mode)?;
             let doc_opts = ops::DocOptions {
@@ -158,12 +158,12 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("fetch", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             ops::fetch(&ws)?;
             Ok(())
         }
         ("generate-lockfile", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             ops::generate_lockfile(&ws)?;
             Ok(())
         }
@@ -276,7 +276,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("metadata", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
 
             let version = match args.value_of("format-version") {
                 None => {
@@ -325,7 +325,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("package", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             ops::package(&ws, &ops::PackageOpts {
                 config,
                 verify: !args.is_present("no-verify"),
@@ -333,13 +333,13 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
                 check_metadata: !args.is_present("no-metadata"),
                 allow_dirty: args.is_present("allow-dirty"),
                 target: args.value_of("target"),
-                jobs: jobs_from_args(args)?,
+                jobs: args.jobs()?,
                 registry: None,
             })?;
             Ok(())
         }
         ("pkgid", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             let spec = args.value_of("spec").or(args.value_of("package"));
             let spec = ops::pkgid(&ws, spec)?;
             println!("{}", spec);
@@ -347,7 +347,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
         }
         ("publish", Some(args)) => {
             let registry = registry_from_args(config, args)?;
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             let index = index_from_args(config, args)?;
 
             ops::publish(&ws, &ops::PublishOpts {
@@ -357,7 +357,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
                 verify: !args.is_present("no-verify"),
                 allow_dirty: args.is_present("allow-dirty"),
                 target: args.value_of("target"),
-                jobs: jobs_from_args(args)?,
+                jobs: args.jobs()?,
                 dry_run: args.is_present("dry-run"),
                 registry,
             })?;
@@ -370,7 +370,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("run", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
 
             let mut compile_opts = compile_options_from_args_for_single_package(
                 config, args, CompileMode::Build,
@@ -403,7 +403,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             }
         }
         ("rustc", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             let mode = match args.value_of("profile") {
                 Some("dev") | None => CompileMode::Build,
                 Some("test") => CompileMode::Test,
@@ -423,7 +423,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("rustdoc", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
             let mut compile_opts = compile_options_from_args_for_single_package(
                 config, args, CompileMode::Doc { deps: false },
             )?;
@@ -447,7 +447,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("test", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
 
             let mut compile_opts = compile_options_from_args(config, args, CompileMode::Test)?;
             let doc = args.is_present("doc");
@@ -492,7 +492,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("update", Some(args)) => {
-            let ws = workspace_from_args(config, args)?;
+            let ws = args.workspace(config)?;
 
             let update_opts = ops::UpdateOptions {
                 aggressive: args.is_present("aggressive"),
index d9b28dcffffea20603525de15f5d25231b984ecb..b01bc785c80ee7a276f4594e6cdf8f37fc5bbfff 100644 (file)
@@ -170,12 +170,29 @@ pub fn subcommand(name: &'static str) -> App {
 }
 
 
-pub trait ArgMatchesExt: Sized {
+pub trait ArgMatchesExt {
     fn root_manifest(&self, config: &Config) -> CargoResult<PathBuf> {
         let manifest_path = self._value_of("manifest-path");
         find_root_manifest_for_wd(manifest_path, config.cwd())
     }
 
+    fn workspace<'a>(&self, config: &'a Config) -> CargoResult<Workspace<'a>> {
+        let root = self.root_manifest(config)?;
+        Workspace::new(&root, config)
+    }
+
+    fn jobs(&self) -> CargoResult<Option<u32>> {
+        let jobs = match self._value_of("jobs") {
+            None => None,
+            Some(jobs) => Some(jobs.parse::<u32>().map_err(|_| {
+                clap::Error::value_validation_auto(
+                    format!("could not parse `{}` as a number", jobs)
+                )
+            })?)
+        };
+        Ok(jobs)
+    }
+
     fn _value_of(&self, name: &str) -> Option<&str>;
 }
 
@@ -191,23 +208,6 @@ pub fn values(args: &ArgMatches, name: &str) -> Vec<String> {
         .collect()
 }
 
-pub fn workspace_from_args<'a>(config: &'a Config, args: &ArgMatches) -> CargoResult<Workspace<'a>> {
-    let root = args.root_manifest(config)?;
-    Workspace::new(&root, config)
-}
-
-pub fn jobs_from_args(args: &ArgMatches) -> CargoResult<Option<u32>> { //FIXME: validation
-    let jobs = match args.value_of("jobs") {
-        None => None,
-        Some(jobs) => Some(jobs.parse::<u32>().map_err(|_| {
-            clap::Error::value_validation_auto(
-                format!("could not parse `{}` as a number", jobs)
-            )
-        })?)
-    };
-    Ok(jobs)
-}
-
 pub fn compile_options_from_args<'a>(
     config: &'a Config,
     args: &'a ArgMatches<'a>,
@@ -234,7 +234,7 @@ pub fn compile_options_from_args<'a>(
 
     let opts = CompileOptions {
         config,
-        jobs: jobs_from_args(args)?,
+        jobs: args.jobs()?,
         target: args.value_of("target"),
         features: values(args, "features"),
         all_features: args.is_present("all-features"),