Move `new_options` to `ArgMatchesExt`
authorAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 10 Mar 2018 14:04:06 +0000 (17:04 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 10 Mar 2018 14:04:06 +0000 (17:04 +0300)
src/bin/cli.rs
src/bin/command_prelude.rs
src/bin/commands/init.rs
src/cargo/ops/cargo_new.rs

index 54706bc91a52663887453e3b21e813c8d46f0496..7c8e5b31b53274d81a12c7fac2f09e391c9c3ec3 100644 (file)
@@ -181,8 +181,7 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("init", Some(args)) => {
-            let path = args.value_of("path").unwrap_or(".");
-            let opts = new_opts_from_args(args, path)?;
+            let opts = args.new_options()?;
             ops::init(&opts, config)?;
             config.shell().status("Created", format!("{} project", opts.kind))?;
             Ok(())
@@ -302,9 +301,9 @@ fn execute_subcommand(config: &mut Config, args: ArgMatches) -> CliResult {
             Ok(())
         }
         ("new", Some(args)) => {
-            let path = args.value_of("path").unwrap();
-            let opts = new_opts_from_args(args, path)?;
+            let opts = args.new_options()?;
             ops::new(&opts, config)?;
+            let path = args.value_of("path").unwrap();
             config.shell().status("Created", format!("{} `{}` project", opts.kind, path))?;
             Ok(())
         }
index 6315368e354eecb7a35f2717faee221f2f48c75e..a51be4a0b7ce8ba34e571cb991dde7ceed45be37 100644 (file)
@@ -254,6 +254,22 @@ pub trait ArgMatchesExt {
         Ok(compile_opts)
     }
 
+    fn new_options(&self) -> CargoResult<NewOptions> {
+        let vcs = self._value_of("vcs").map(|vcs| match vcs {
+            "git" => VersionControl::Git,
+            "hg" => VersionControl::Hg,
+            "pijul" => VersionControl::Pijul,
+            "fossil" => VersionControl::Fossil,
+            "none" => VersionControl::NoVcs,
+            vcs => panic!("Impossible vcs: {:?}", vcs),
+        });
+        NewOptions::new(vcs,
+                        self._is_present("bin"),
+                        self._is_present("lib"),
+                        self._value_of("path").unwrap().to_string(),
+                        self._value_of("name").map(|s| s.to_string()))
+    }
+
     fn _value_of(&self, name: &str) -> Option<&str>;
 
     fn _values_of(&self, name: &str) -> Vec<String>;
@@ -283,22 +299,6 @@ pub fn values(args: &ArgMatches, name: &str) -> Vec<String> {
         .collect()
 }
 
-pub fn new_opts_from_args<'a>(args: &'a ArgMatches<'a>, path: &'a str) -> CargoResult<NewOptions<'a>> {
-    let vcs = args.value_of("vcs").map(|vcs| match vcs {
-        "git" => VersionControl::Git,
-        "hg" => VersionControl::Hg,
-        "pijul" => VersionControl::Pijul,
-        "fossil" => VersionControl::Fossil,
-        "none" => VersionControl::NoVcs,
-        vcs => panic!("Impossible vcs: {:?}", vcs),
-    });
-    NewOptions::new(vcs,
-                    args.is_present("bin"),
-                    args.is_present("lib"),
-                    path,
-                    args.value_of("name"))
-}
-
 pub fn registry_from_args(config: &Config, args: &ArgMatches) -> CargoResult<Option<String>> {
     match args.value_of("registry") {
         Some(registry) => {
index e9d618b43743fb29e106253dfbc8fa7e29760e71..945ab9a748ae1df09de9668624fbd1dbaff27e93 100644 (file)
@@ -3,6 +3,6 @@ use command_prelude::*;
 pub fn cli() -> App {
     subcommand("init")
         .about("Create a new cargo package in an existing directory")
-        .arg(Arg::with_name("path"))
+        .arg(Arg::with_name("path").default_value("."))
         .arg_new_opts()
 }
index 156ad3b0b3a360d3952ffb6acfcf0462b694fde0..a9594d6ecf957e5a2a8dd640ec44733b782c4420 100644 (file)
@@ -19,11 +19,11 @@ use toml;
 pub enum VersionControl { Git, Hg, Pijul, Fossil, NoVcs }
 
 #[derive(Debug)]
-pub struct NewOptions<'a> {
+pub struct NewOptions {
     pub version_control: Option<VersionControl>,
     pub kind: NewProjectKind,
-    pub path: &'a str,
-    pub name: Option<&'a str>,
+    pub path: String,
+    pub name: Option<String>,
 }
 
 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
@@ -61,12 +61,12 @@ struct MkOptions<'a> {
     bin: bool,
 }
 
-impl<'a> NewOptions<'a> {
+impl NewOptions {
     pub fn new(version_control: Option<VersionControl>,
                bin: bool,
                lib: bool,
-               path: &'a str,
-               name: Option<&'a str>) -> CargoResult<NewOptions<'a>> {
+               path: String,
+               name: Option<String>) -> CargoResult<NewOptions> {
 
         let kind = match (bin, lib) {
             (true, true) => bail!("can't specify both lib and binary outputs"),
@@ -87,7 +87,7 @@ struct CargoNewConfig {
 }
 
 fn get_name<'a>(path: &'a Path, opts: &'a NewOptions) -> CargoResult<&'a str> {
-    if let Some(name) = opts.name {
+    if let Some(ref name) = opts.name {
         return Ok(name);
     }
 
@@ -256,7 +256,7 @@ fn plan_new_source_file(bin: bool, project_name: String) -> SourceFileInformatio
 }
 
 pub fn new(opts: &NewOptions, config: &Config) -> CargoResult<()> {
-    let path = config.cwd().join(opts.path);
+    let path = config.cwd().join(&opts.path);
     if fs::metadata(&path).is_ok() {
         bail!("destination `{}` already exists\n\n\
             Use `cargo init` to initialize the directory\
@@ -283,7 +283,7 @@ pub fn new(opts: &NewOptions, config: &Config) -> CargoResult<()> {
 }
 
 pub fn init(opts: &NewOptions, config: &Config) -> CargoResult<()> {
-    let path = config.cwd().join(opts.path);
+    let path = config.cwd().join(&opts.path);
 
     let cargotoml_path = path.join("Cargo.toml");
     if fs::metadata(&cargotoml_path).is_ok() {