use super::{InspectOptions, Triage};
use crate::out::Out;
use anyhow::Result;
use clap::{CommandFactory, Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(
version = crate::GIT_VERSION,
name = "triage",
about = "Doctor-style diagnostics over canonical faculty collections"
)]
pub struct Cli {
#[arg(long, env = "PILE")]
pile: PathBuf,
#[arg(long, env = "TRIBLESPACE_KEY")]
key: Option<PathBuf>,
#[command(subcommand)]
command: Option<Command>,
}
#[derive(Subcommand)]
enum Command {
Scan {
#[arg(long, default_value_t = 40)]
recent: usize,
#[arg(long, default_value_t = 3)]
loop_min: usize,
#[arg(long, default_value_t = 15)]
stale_min: i64,
},
Loops {
#[arg(long, default_value_t = 40)]
recent: usize,
#[arg(long, default_value_t = 3)]
min_repeat: usize,
},
Timeline {
#[arg(long, default_value_t = 80)]
recent: usize,
},
Cover {
#[arg(long)]
full: bool,
},
Chunk {
#[arg(value_name = "ID")]
id: String,
},
Turn {
#[arg(long, default_value_t = 1)]
turn: usize,
#[arg(long)]
full: bool,
},
Context {
#[arg(long, default_value_t = 1)]
turn: usize,
#[arg(long)]
full: bool,
#[arg(long)]
raw: bool,
},
}
pub fn run() -> Result<()> {
let cli = Cli::parse();
crate::cli::with_output("triage", |out| execute(cli, out))
}
pub fn execute(cli: Cli, out: &mut Out<'_>) -> Result<()> {
let Some(command) = cli.command else {
return out.line(Cli::command().render_long_help().to_string());
};
let triage = Triage::new(cli.pile, cli.key);
match command {
Command::Scan {
recent,
loop_min,
stale_min,
} => triage.scan(
&InspectOptions {
recent,
loop_min,
stale_min,
},
out,
),
Command::Loops { recent, min_repeat } => triage.loops(recent, min_repeat, out),
Command::Timeline { recent } => triage.timeline(recent, out),
Command::Cover { full } => triage.cover(full, out),
Command::Chunk { id } => triage.chunk(&id, out),
Command::Turn { turn, full } => triage.turn(turn, full, out),
Command::Context { turn, full, raw } => triage.context(turn, full, raw, out),
}
}