From 50284b114ba32de17a21e47030a43ce686c3d6d0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 10 Mar 2018 17:04:06 +0300 Subject: [PATCH] Move `new_options` to `ArgMatchesExt` --- src/bin/cli.rs | 7 +++---- src/bin/command_prelude.rs | 32 ++++++++++++++++---------------- src/bin/commands/init.rs | 2 +- src/cargo/ops/cargo_new.rs | 18 +++++++++--------- 4 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/bin/cli.rs b/src/bin/cli.rs index 54706bc91..7c8e5b31b 100644 --- a/src/bin/cli.rs +++ b/src/bin/cli.rs @@ -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(()) } diff --git a/src/bin/command_prelude.rs b/src/bin/command_prelude.rs index 6315368e3..a51be4a0b 100644 --- a/src/bin/command_prelude.rs +++ b/src/bin/command_prelude.rs @@ -254,6 +254,22 @@ pub trait ArgMatchesExt { Ok(compile_opts) } + fn new_options(&self) -> CargoResult { + 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; @@ -283,22 +299,6 @@ pub fn values(args: &ArgMatches, name: &str) -> Vec { .collect() } -pub fn new_opts_from_args<'a>(args: &'a ArgMatches<'a>, path: &'a str) -> CargoResult> { - 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> { match args.value_of("registry") { Some(registry) => { diff --git a/src/bin/commands/init.rs b/src/bin/commands/init.rs index e9d618b43..945ab9a74 100644 --- a/src/bin/commands/init.rs +++ b/src/bin/commands/init.rs @@ -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() } diff --git a/src/cargo/ops/cargo_new.rs b/src/cargo/ops/cargo_new.rs index 156ad3b0b..a9594d6ec 100644 --- a/src/cargo/ops/cargo_new.rs +++ b/src/cargo/ops/cargo_new.rs @@ -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, pub kind: NewProjectKind, - pub path: &'a str, - pub name: Option<&'a str>, + pub path: String, + pub name: Option, } #[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, bin: bool, lib: bool, - path: &'a str, - name: Option<&'a str>) -> CargoResult> { + path: String, + name: Option) -> CargoResult { 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() { -- 2.30.2