use crate::error::Result;
use crate::output::{print_project_description, BOLD, CYAN, GRAY, RED, RESET, YELLOW};
use crate::prompt;
pub fn describe_command(project_name: &str) -> Result<()> {
let project_name = if project_name.is_empty() {
let current = crate::config::current_project_name()?;
if crate::config::project_exists(¤t)? {
println!(
"{GRAY}No project specified, using current directory: {CYAN}{}{RESET}",
current
);
println!();
current
} else {
println!("{RED}No project specified.{RESET}");
println!();
println!(
"The current directory {CYAN}{}{RESET} is not an autom8 project.",
current
);
println!();
let projects = crate::config::list_projects()?;
if projects.is_empty() {
println!("{GRAY}No projects have been created yet.{RESET}");
println!();
println!("Run {CYAN}autom8{RESET} in a project directory to create a project.");
} else {
println!("{BOLD}Available projects:{RESET}");
for project in &projects {
println!(" - {}", project);
}
println!();
println!("Run {CYAN}autom8 describe <project-name>{RESET} to describe a project.");
}
return Ok(());
}
} else {
project_name.to_string()
};
match crate::config::get_project_description(&project_name)? {
Some(desc) => {
if desc.specs.len() > 1 {
println!(
"{YELLOW}Multiple specs found for project '{}'{RESET}",
&project_name
);
println!();
let options: Vec<String> = desc
.specs
.iter()
.map(|spec| {
let progress = format!("{}/{}", spec.completed_count, spec.total_count);
format!("{} ({})", spec.filename, progress)
})
.collect();
let mut all_options: Vec<&str> = vec!["Show all specs"];
all_options.extend(options.iter().map(|s| s.as_str()));
let choice =
prompt::select("Which spec would you like to describe?", &all_options, 0);
if choice == 0 {
print_project_description(&desc);
} else {
let selected_spec = &desc.specs[choice - 1];
let single_spec_desc = crate::config::ProjectDescription {
specs: vec![selected_spec.clone()],
..desc
};
print_project_description(&single_spec_desc);
}
} else {
print_project_description(&desc);
}
Ok(())
}
None => {
println!("{RED}Project '{}' not found.{RESET}", &project_name);
println!();
println!(
"The project directory {CYAN}~/.config/autom8/{}{RESET} does not exist.",
&project_name
);
println!();
let projects = crate::config::list_projects()?;
if projects.is_empty() {
println!("{GRAY}No projects have been created yet.{RESET}");
println!();
println!("Run {CYAN}autom8{RESET} in a project directory to create a project.");
} else {
println!("{BOLD}Available projects:{RESET}");
for project in &projects {
println!(" - {}", project);
}
println!();
println!("Run {CYAN}autom8 describe <project-name>{RESET} to describe a project.");
}
Ok(())
}
}
}