From 410b54f2df4a338574aa4b36e93b8b1d8178f841 Mon Sep 17 00:00:00 2001 From: Collins Muriuki Date: Wed, 20 Nov 2024 17:52:40 +0300 Subject: [PATCH] Add go back functionality for hc scaffold entry-type --- src/scaffold/entry_type/fields.rs | 99 +++++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 13 deletions(-) diff --git a/src/scaffold/entry_type/fields.rs b/src/scaffold/entry_type/fields.rs index f3d3534b..0ba1aaa7 100644 --- a/src/scaffold/entry_type/fields.rs +++ b/src/scaffold/entry_type/fields.rs @@ -34,6 +34,7 @@ pub fn choose_fields( zome_file_tree, field_types_templates, no_ui, + None, )?; println!(); @@ -45,25 +46,95 @@ pub fn choose_fields( } println!( - "Chosen fields:\n {}", + "Current fields:\n{}", fields .iter() - .map(|f| format!("{}: {}", f.field_name.clone(), f.field_type)) + .map(|f| format!(" {}: {}\n", f.field_name.clone(), f.field_type)) .collect::>() - .join(", ") + .join("") .italic() ); let selection = Select::with_theme(&ColorfulTheme::default()) .with_prompt( - "Do you want to proceed with the current entry type or restart from the beginning?", + "Do you want to proceed with the current entry type, modify or start again from the beginning?", ) .item("Confirm") + .item("Modify") .item("Restart") .default(0) .interact()?; if selection == 1 { + loop { + let action = Select::with_theme(&ColorfulTheme::default()) + .with_prompt("What would you like to do?") + .items(&["Modify Field", "Add Field", "Remove Field", "Done"]) + .interact()?; + + match action { + 0 => { + // Modify field + let field_to_modify = Select::with_theme(&ColorfulTheme::default()) + .with_prompt("Select field to modify") + .items( + &fields + .iter() + .map(|f| format!("{}: {}", f.field_name, f.field_type).italic()) + .collect::>(), + ) + .interact()?; + + let new_field = choose_field( + entry_type_name, + zome_file_tree, + field_types_templates, + no_ui, + Some(&fields[field_to_modify].field_name), + )?; + fields[field_to_modify] = new_field; + } + 1 => { + // Add field + let new_field = choose_field( + entry_type_name, + zome_file_tree, + field_types_templates, + no_ui, + None, + )?; + fields.push(new_field); + } + 2 => { + // Remove field + if !fields.is_empty() { + let field_to_remove = Select::with_theme(&ColorfulTheme::default()) + .with_prompt("Select field to remove") + .items( + &fields + .iter() + .map(|f| format!("{}: {}", f.field_name, f.field_type).italic()) + .collect::>(), + ) + .interact()?; + fields.remove(field_to_remove); + } + } + 3 => break, // Done + _ => unreachable!(), + } + + println!( + "\nCurrent fields:\n{}", + fields + .iter() + .map(|f| format!(" {}: {}\n", f.field_name, f.field_type)) + .collect::>() + .join("") + .italic() + ); + } + } else if selection == 2 { return choose_fields( entry_type_name, zome_file_tree, @@ -80,6 +151,7 @@ fn choose_field( zome_file_tree: &ZomeFileTree, field_types_templates: &FileTree, no_ui: bool, + initial_field_name: Option<&str>, ) -> ScaffoldResult { let field_types = FieldType::list(); let field_type_names: Vec = field_types @@ -88,15 +160,16 @@ fn choose_field( .map(|s| s.to_string()) .collect(); - let field_name = input_with_custom_validation("Field name (snake_case):", None, |input| { - if let Err(e) = check_case(&input, "field_name", Case::Snake) { - return Err(e.to_string()); - } - if let Err(e) = check_for_reserved_keywords(&input) { - return Err(e.to_string()); - } - Ok(()) - })?; + let field_name = + input_with_custom_validation("Field name (snake_case):", initial_field_name, |input| { + if let Err(e) = check_case(&input, "field_name", Case::Snake) { + return Err(e.to_string()); + } + if let Err(e) = check_for_reserved_keywords(&input) { + return Err(e.to_string()); + } + Ok(()) + })?; let selection = Select::with_theme(&ColorfulTheme::default()) .with_prompt("Choose field type:")