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(())
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(())
}
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>;
.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) => {
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()
}
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)]
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"),
}
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);
}
}
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\
}
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() {