use clap::Parser; #[derive(Debug, clap::Parser)] #[command(version, about, long_about = None)] struct Args { /// Directory containing issues. #[arg(short = 'd', long)] issues_dir: Option, /// Branch containing issues. #[arg(short = 'b', long)] issues_branch: Option, /// Type of behavior/output. #[command(subcommand)] command: Commands, } #[derive(clap::Subcommand, Debug)] enum Commands { /// List issues. List, /// Create a new issue. New { description: Option }, /// Edit the description of an issue. Edit { issue_id: String }, /// Show the full description of an issue. Show { issue_id: String }, } fn handle_command(args: &Args, issues_dir: &std::path::Path) -> anyhow::Result<()> { match &args.command { Commands::List => { let issues = entomologist::issues::Issues::new_from_dir(std::path::Path::new(issues_dir))?; for (uuid, issue) in issues.issues.iter() { println!("{} {} ({:?})", uuid, issue.title(), issue.state); } } Commands::New { description: Some(description), } => { let mut issue = entomologist::issue::Issue::new(issues_dir)?; issue.set_description(description)?; println!("created new issue '{}'", issue.title()); } Commands::New { description: None } => { let mut issue = entomologist::issue::Issue::new(issues_dir)?; issue.edit_description()?; println!("created new issue '{}'", issue.title()); } Commands::Edit { issue_id } => { let mut issues = entomologist::issues::Issues::new_from_dir(std::path::Path::new(issues_dir))?; match issues.issues.get_mut(issue_id) { Some(issue) => { issue.edit_description()?; } None => { println!("issue {} not found", issue_id); } } } Commands::Show { issue_id } => { let issues = entomologist::issues::Issues::new_from_dir(std::path::Path::new(issues_dir))?; match issues.issues.get(issue_id) { Some(issue) => { println!("issue {}", issue_id); println!("state {:?}", issue.state); println!(""); println!("{}", issue.description); } None => { println!("issue {} not found", issue_id); } } } } Ok(()) } fn main() -> anyhow::Result<()> { let args: Args = Args::parse(); // println!("{:?}", args); if let (Some(_), Some(_)) = (&args.issues_dir, &args.issues_branch) { return Err(anyhow::anyhow!( "don't specify both `--issues-dir` and `--issues-branch`" )); } if let Some(dir) = &args.issues_dir { let dir = std::path::Path::new(dir); handle_command(&args, dir)?; } else { let branch = match &args.issues_branch { Some(branch) => branch, None => "entomologist-data", }; if !entomologist::git::git_branch_exists(branch)? { entomologist::git::create_orphan_branch(branch)?; } let worktree = entomologist::git::Worktree::new(branch)?; handle_command(&args, worktree.path())?; } Ok(()) }