use clap::{Args, Subcommand};
use homeboy::triage::{self, TriageOptions, TriageOutput, TriageTarget};
use std::path::PathBuf;
use super::CmdResult;
#[derive(Args)]
pub struct TriageArgs {
#[command(subcommand)]
command: TriageCommand,
#[arg(long, global = true)]
issues: bool,
#[arg(long, global = true)]
prs: bool,
#[arg(long, global = true)]
mine: bool,
#[arg(long, global = true, value_name = "USER")]
assigned: Option<String>,
#[arg(long, global = true, value_name = "LABEL")]
label: Vec<String>,
#[arg(long, global = true, value_name = "NUMBER")]
issue: Vec<u64>,
#[arg(long, global = true, value_name = "PATH")]
issues_from_file: Option<PathBuf>,
#[arg(long, global = true)]
needs_review: bool,
#[arg(long, global = true)]
failing_checks: bool,
#[arg(long, global = true)]
drilldown: bool,
#[arg(long, global = true, value_name = "DAYS")]
stale: Option<String>,
#[arg(long, global = true, default_value_t = 30)]
limit: usize,
}
#[derive(Subcommand)]
enum TriageCommand {
Component { component_id: String },
Project { project_id: String },
Fleet { fleet_id: String },
Rig { rig_id: String },
Workspace,
}
pub fn run(args: TriageArgs, _global: &super::GlobalArgs) -> CmdResult<TriageOutput> {
let mut issue_numbers = args.issue;
if let Some(path) = args.issues_from_file {
issue_numbers.extend(triage::parse_issue_numbers_file(&path)?);
}
issue_numbers.sort_unstable();
issue_numbers.dedup();
let include_issues = args.issues || !args.prs || !issue_numbers.is_empty();
let include_prs = args.prs || !args.issues;
let options = TriageOptions {
include_issues,
include_prs,
mine: args.mine,
assigned: args.assigned,
labels: args.label,
needs_review: args.needs_review,
failing_checks: args.failing_checks,
drilldown: args.drilldown,
issue_numbers,
stale_days: match args.stale {
Some(value) => Some(triage::parse_stale_days(&value)?),
None => None,
},
limit: args.limit,
};
let target = match args.command {
TriageCommand::Component { component_id } => TriageTarget::Component(component_id),
TriageCommand::Project { project_id } => TriageTarget::Project(project_id),
TriageCommand::Fleet { fleet_id } => TriageTarget::Fleet(fleet_id),
TriageCommand::Rig { rig_id } => TriageTarget::Rig(rig_id),
TriageCommand::Workspace => TriageTarget::Workspace,
};
Ok((triage::run(target, options)?, 0))
}