1use anyhow::Result;
16use clap::Args;
17use std::path::Path;
18
19use crate::cli::load_and_validate_queues_read_only;
20use crate::config::Resolved;
21use crate::queue;
22use crate::reports;
23
24use super::QueueReportFormat;
25
26#[derive(Args)]
28pub struct QueueStatsArgs {
29 #[arg(long)]
31 pub tag: Vec<String>,
32
33 #[arg(long, value_enum, default_value_t = QueueReportFormat::Text)]
35 pub format: QueueReportFormat,
36
37 #[arg(long, short)]
39 pub quiet: bool,
40}
41
42pub(crate) fn handle(resolved: &Resolved, args: QueueStatsArgs) -> Result<()> {
43 let (queue_file, done_file) = load_and_validate_queues_read_only(resolved, true)?;
44
45 if !args.quiet {
47 let size_threshold =
48 queue::size_threshold_or_default(resolved.config.queue.size_warning_threshold_kb);
49 let count_threshold =
50 queue::count_threshold_or_default(resolved.config.queue.task_count_warning_threshold);
51 if let Ok(result) = queue::check_queue_size(
52 &resolved.queue_path,
53 queue_file.tasks.len(),
54 size_threshold,
55 count_threshold,
56 ) {
57 queue::print_size_warning_if_needed(&result, args.quiet);
58 }
59 }
60
61 let done_ref = done_file
62 .as_ref()
63 .filter(|d| !d.tasks.is_empty() || resolved.done_path.exists());
64
65 let file_size_kb = std::fs::metadata(&resolved.queue_path)
67 .map(|m| m.len() / 1024)
68 .unwrap_or(0);
69
70 let cache_dir: Option<&Path> = Some(&resolved.repo_root.join(".ralph/cache"));
72
73 reports::print_stats(
74 &queue_file,
75 done_ref,
76 &args.tag,
77 args.format.into(),
78 file_size_kb,
79 &resolved.config.agent,
80 cache_dir,
81 )?;
82 Ok(())
83}