1use anyhow::Result;
14use clap::Args;
15
16use crate::cli::load_and_validate_queues_read_only;
17use crate::config::Resolved;
18use crate::contracts::TaskStatus;
19use crate::reports;
20
21use super::{QueueReportFormat, StatusArg};
22
23#[derive(Args)]
25#[command(
26 about = "Show task aging buckets to identify stale work",
27 after_long_help = "Examples:\n ralph queue aging\n ralph queue aging --format json\n ralph queue aging --status todo --status doing\n ralph queue aging --status doing"
28)]
29pub struct QueueAgingArgs {
30 #[arg(long, value_enum)]
32 pub status: Vec<StatusArg>,
33
34 #[arg(long, value_enum, default_value_t = QueueReportFormat::Text)]
36 pub format: QueueReportFormat,
37}
38
39pub(crate) fn handle(resolved: &Resolved, args: QueueAgingArgs) -> Result<()> {
40 let (queue_file, _done_file) = load_and_validate_queues_read_only(resolved, false)?;
41
42 let statuses: Vec<TaskStatus> = if args.status.is_empty() {
43 vec![TaskStatus::Todo, TaskStatus::Doing]
44 } else {
45 args.status.into_iter().map(Into::into).collect()
46 };
47
48 let thresholds = reports::AgingThresholds::from_queue_config(&resolved.config.queue)?;
49 reports::print_aging(&queue_file, &statuses, thresholds, args.format.into())?;
50 Ok(())
51}