use crate::errors::CliError;
use super::{NargoConfig, init_cmd::initialize_project};
use clap::Args;
use nargo::package::{CrateName, PackageType};
use std::path::PathBuf;
#[allow(rustdoc::broken_intra_doc_links)]
#[derive(Debug, Clone, Args)]
pub(crate) struct NewCommand {
path: PathBuf,
#[clap(long)]
name: Option<CrateName>,
#[arg(long, conflicts_with = "bin", conflicts_with = "contract")]
pub(crate) lib: bool,
#[arg(long, conflicts_with = "lib", conflicts_with = "contract")]
pub(crate) bin: bool,
#[arg(long, conflicts_with = "lib", conflicts_with = "bin")]
pub(crate) contract: bool,
}
pub(crate) fn run(args: NewCommand, config: NargoConfig) -> Result<(), CliError> {
let package_dir = config.program_dir.join(&args.path);
if package_dir.exists() {
return Err(CliError::DestinationAlreadyExists(package_dir));
}
let package_name = match args.name {
Some(name) => name,
None => {
let name = args.path.file_name().unwrap().to_str().unwrap();
name.parse().map_err(CliError::InvalidPackageName)?
}
};
let package_type = if args.lib {
PackageType::Library
} else if args.contract {
PackageType::Contract
} else {
PackageType::Binary
};
initialize_project(package_dir, package_name, package_type)
}