From fe6013fb1ad7549178008052adfcea5f04353b7a Mon Sep 17 00:00:00 2001 From: Ondrej Prazak Date: Sun, 12 Jan 2020 13:42:05 +0100 Subject: [PATCH] Refs #58 - Simplify name generating logic --- src/commands/generate/mod.rs | 88 ++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 49 deletions(-) diff --git a/src/commands/generate/mod.rs b/src/commands/generate/mod.rs index 7f39a227e..b76c2ff38 100644 --- a/src/commands/generate/mod.rs +++ b/src/commands/generate/mod.rs @@ -15,8 +15,30 @@ pub fn generate( ) -> Result<(), failure::Error> { validate_worker_name(name)?; - log::info!("Generating a new worker project with name '{}'", name); - run_generate(name, template)?; + let dirname_exists = match directory_exists(name) { + Ok(val) => val, + Err(_) => true, + }; + + let new_name: String; + + if dirname_exists { + new_name = match generate_name(name) { + Ok(val) => val, + Err(_) => { + log::debug!( + "Failed to auto-increment name for a new worker project, using '{}'", + name + ); + String::from(name) + } + }; + } else { + new_name = String::from(name); + } + + log::info!("Generating a new worker project with name '{}'", new_name); + run_generate(&new_name, template)?; let config_path = PathBuf::from("./").join(&name); // TODO: this is tightly coupled to our site template. Need to remove once @@ -26,7 +48,7 @@ pub fn generate( } else { None }; - Manifest::generate(name.to_string(), target_type, &config_path, generated_site)?; + Manifest::generate(new_name, target_type, &config_path, generated_site)?; Ok(()) } @@ -35,20 +57,7 @@ pub fn run_generate(name: &str, template: &str) -> Result<(), failure::Error> { let tool_name = "cargo-generate"; let binary_path = install::install(tool_name, "ashleygwilliams")?.binary(tool_name)?; - let new_name = match generate_name(name) { - Ok(val) => val, - Err(_) => { - log::debug!( - "Failed to auto-increment name for a new worker project, using '{}'", - name - ); - String::from(name) - } - }; - - let args = [ - "generate", "--git", template, "--name", &new_name, "--force", - ]; + let args = ["generate", "--git", template, "--name", name, "--force"]; let command = command(binary_path, &args); let command_name = format!("{:?}", command); @@ -56,25 +65,13 @@ pub fn run_generate(name: &str, template: &str) -> Result<(), failure::Error> { } fn generate_name(name: &str) -> Result { - let digits = detect_num(name); - let mut new_name = String::from(name); - let mut chars = new_name.chars().collect::>(); - let split = chars.split_off(new_name.len() - digits); - let bare_name = chars.into_iter().collect::(); - - let mut num = match split.into_iter().collect::().parse::() { - Ok(val) => Some(val), - Err(_) => None, - }; - + let mut num = 1; let entry_names = read_current_dir()?; + let mut new_name = construct_name(&name, num); while entry_names.contains(&OsString::from(&new_name)) { - num = num.map(|val| val + 1); - new_name = construct_name(&bare_name, num); - if num.is_none() { - num = Some(1); - } + num = num + 1; + new_name = construct_name(&name, num); } Ok(new_name) } @@ -85,28 +82,21 @@ fn read_current_dir() -> Result, failure::Error> { for entry in fs::read_dir(current_dir)? { let entry = entry?; - entry_names.push(entry.file_name()); + let path = entry.path(); + if path.is_dir() { + entry_names.push(entry.file_name()); + } } Ok(entry_names) } -fn construct_name(bare_name: &str, num: Option) -> String { - let new_num = match num { - Some(val) => val.to_string(), - None => String::from("1"), - }; - String::from(bare_name) + &new_num +fn directory_exists(dirname: &str) -> Result { + let entry_names = read_current_dir()?; + Ok(entry_names.contains(&OsString::from(dirname))) } -fn detect_num(name: &str) -> usize { - let digits = String::from(name).chars().rev().fold(0, |memo, item| { - if item.is_digit(10) { - memo + 1 - } else { - return memo; - } - }); - digits +fn construct_name(name: &str, num: i32) -> String { + format!("{}-{}", name, num) } fn command(binary_path: PathBuf, args: &[&str]) -> Command {