use clap::Subcommand;
use std::path::PathBuf;
#[derive(Subcommand)]
pub enum CapabilityAction {
Tree {
#[arg(long)]
root: PathBuf,
#[arg(long, default_value = ".")]
path: String,
#[arg(long, default_value_t = 2)]
depth: usize,
},
}
pub fn dispatch(action: CapabilityAction) {
let code = match action {
CapabilityAction::Tree { root, path, depth } => cmd_tree(&root, &path, depth),
};
std::process::exit(code);
}
fn cmd_tree(root: &std::path::Path, path: &str, depth: usize) -> i32 {
let root = match root.canonicalize() {
Ok(canonical) => canonical,
Err(error) => {
eprintln!("resolve --root {}: {error}", root.display());
return 1;
}
};
match super::repo_tree(&root, path, depth) {
Ok(json) => {
println!("{json}");
0
}
Err(error) => {
eprintln!("{error}");
1
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
#[test]
fn cmd_tree_prints_json_envelope_on_success() {
let root = std::env::temp_dir().join(format!("yana-cap-cli-{}", uuid::Uuid::new_v4()));
fs::create_dir_all(root.join("src")).unwrap();
fs::write(root.join("src/main.rs"), "fn main() {}").unwrap();
let json = super::super::repo_tree(&root, ".", 2).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert_eq!(parsed["capability"], "repo.tree");
assert!(json.contains("src/main.rs"));
fs::remove_dir_all(root).ok();
}
#[test]
fn cmd_tree_reports_error_for_missing_root() {
let missing =
std::env::temp_dir().join(format!("yana-cap-cli-missing-{}", uuid::Uuid::new_v4()));
let code = cmd_tree(&missing, ".", 2);
assert_eq!(code, 1);
}
}