Introduce ArgMatchesExt trait
authorAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 10 Mar 2018 13:34:28 +0000 (16:34 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 10 Mar 2018 13:34:28 +0000 (16:34 +0300)
src/bin/cli.rs
src/bin/command_prelude.rs
src/cargo/util/important_paths.rs

index 0b6242e59fb45248762528a5767a73bc4a9f54c2..b2bd8ec8fa28f06e6a198bbe7aee939e7f3c7067 100644 (file)
@@ -224,7 +224,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("locate-project", Some(args)) => {
-            let root = root_manifest_from_args(config, args)?;
+            let root = args.root_manifest(config)?;
 
             let root = root.to_str()
                 .ok_or_else(|| format_err!("your project path contains characters \
@@ -364,7 +364,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("read-manifest", Some(args)) => {
-            let root = root_manifest_from_args(config, args)?;
+            let root = args.root_manifest(config)?;
             let pkg = Package::for_path(&root, config)?;
             cargo::print_json(&pkg);
             Ok(())
@@ -512,7 +512,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             }
 
             let mut contents = String::new();
-            let filename = match root_manifest_from_args(config, args) {
+            let filename = match args.root_manifest(config) {
                 Ok(filename) => filename,
                 Err(e) => fail("invalid", &e.to_string()),
             };
index d8a5fa7eb6527c57f5c08736e96e91684237c708..d9b28dcffffea20603525de15f5d25231b984ecb 100644 (file)
@@ -169,20 +169,30 @@ pub fn subcommand(name: &'static str) -> App {
         ])
 }
 
+
+pub trait ArgMatchesExt: Sized {
+    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 _value_of(&self, name: &str) -> Option<&str>;
+}
+
+impl<'a> ArgMatchesExt for ArgMatches<'a> {
+    fn _value_of(&self, name: &str) -> Option<&str> {
+        self.value_of(name)
+    }
+}
+
 pub fn values(args: &ArgMatches, name: &str) -> Vec<String> {
     args.values_of(name).unwrap_or_default()
         .map(|s| s.to_string())
         .collect()
 }
 
-
-pub fn root_manifest_from_args(config: &Config, args: &ArgMatches) -> CargoResult<PathBuf> {
-    let manifest_path = args.value_of("manifest-path").map(|s| s.to_string());
-    find_root_manifest_for_wd(manifest_path, config.cwd())
-}
-
 pub fn workspace_from_args<'a>(config: &'a Config, args: &ArgMatches) -> CargoResult<Workspace<'a>> {
-    let root = root_manifest_from_args(config, args)?;
+    let root = args.root_manifest(config)?;
     Workspace::new(&root, config)
 }
 
index faa5dfe9b0cd30786201aee06ae8590c776e7f3e..4371de4b92c21384e7fa999e2dbe06fb14a3e8cc 100644 (file)
@@ -35,7 +35,7 @@ pub fn find_project_manifest(pwd: &Path, file: &str) -> CargoResult<PathBuf> {
 }
 
 /// Find the root Cargo.toml
-pub fn find_root_manifest_for_wd(manifest_path: Option<String>, cwd: &Path)
+pub fn find_root_manifest_for_wd(manifest_path: Option<&str>, cwd: &Path)
                                   -> CargoResult<PathBuf> {
     match manifest_path {
         Some(path) => {