Skip to content

Commit

Permalink
Add go back functionality for hc scaffold entry-type
Browse files Browse the repository at this point in the history
  • Loading branch information
c12i committed Nov 20, 2024
1 parent 2c5dc23 commit 410b54f
Showing 1 changed file with 86 additions and 13 deletions.
99 changes: 86 additions & 13 deletions src/scaffold/entry_type/fields.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ pub fn choose_fields(
zome_file_tree,
field_types_templates,
no_ui,
None,
)?;
println!();

Expand All @@ -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::<Vec<String>>()
.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::<Vec<_>>(),
)
.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::<Vec<_>>(),
)
.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::<Vec<String>>()
.join("")
.italic()
);
}
} else if selection == 2 {
return choose_fields(
entry_type_name,
zome_file_tree,
Expand All @@ -80,6 +151,7 @@ fn choose_field(
zome_file_tree: &ZomeFileTree,
field_types_templates: &FileTree,
no_ui: bool,
initial_field_name: Option<&str>,
) -> ScaffoldResult<FieldDefinition> {
let field_types = FieldType::list();
let field_type_names: Vec<String> = field_types
Expand All @@ -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:")
Expand Down

0 comments on commit 410b54f

Please sign in to comment.