use crate::commands::generate_constraint;
use crate::commands::generate_domain;
use crate::error::CliResult;
use crate::output;
#[allow(clippy::too_many_arguments)]
pub fn run(
name: &str,
fields: &[String],
with_entity: bool,
constraint: Option<&str>,
pair: bool,
force: bool,
pretend: bool,
) -> CliResult {
output::print_heading(&format!("Scaffolding '{}'", name));
println!();
let (planning_variable, extra_fields) = split_planning_variable(fields);
if with_entity {
output::print_status("scaffold", &format!("entity '{}'", name));
generate_domain::run_entity(
name,
planning_variable.as_deref(),
&extra_fields,
force,
pretend,
)?;
}
if pair {
let pair_name = format!("{}_pair", name);
output::print_status("scaffold", &format!("paired entity '{}'", pair_name));
generate_domain::run_entity(
&pair_name,
planning_variable.as_deref(),
&extra_fields,
force,
pretend,
)?;
}
if let Some(constraint_name) = constraint {
output::print_status("scaffold", &format!("constraint '{}'", constraint_name));
let use_pair = pair;
generate_constraint::run(
constraint_name,
false, !use_pair, use_pair, false, false, false, force,
pretend,
)?;
}
println!();
if !output::is_quiet() {
output::print_success(&format!(" Scaffold for '{}' complete", name));
println!();
}
Ok(())
}
fn split_planning_variable(fields: &[String]) -> (Option<String>, Vec<String>) {
if fields.is_empty() {
return (None, vec![]);
}
let first = &fields[0];
let planning_variable = first.split(':').next().map(|s| s.trim().to_string());
let extra = fields[1..].to_vec();
(planning_variable, extra)
}
#[cfg(test)]
#[path = "run_tests.rs"]
mod tests;