use anyhow::{Result, anyhow};
use znippy_common::plugin::ArchiveTypePlugin;
use znippy_common::plugins::cargo_native::CargoPlugin;
use znippy_plugin_maven::NativeMavenPlugin;
use znippy_plugin_python::NativePythonPlugin;
pub fn builtin_handlers() -> Vec<Box<dyn ArchiveTypePlugin>> {
let mut handlers: Vec<Box<dyn ArchiveTypePlugin>> = vec![
Box::new(CargoPlugin::new()),
Box::new(NativePythonPlugin),
Box::new(NativeMavenPlugin),
];
handlers.extend(znippy_common::plugins::skeletons::skeleton_handlers());
handlers.sort_by_key(|h| h.type_id());
handlers
}
pub fn find_handler(query: &str) -> Result<Box<dyn ArchiveTypePlugin>> {
let q = query.to_ascii_lowercase();
builtin_handlers()
.into_iter()
.find(|h| {
let m = h.meta();
m.name.eq_ignore_ascii_case(&q) || m.aliases.iter().any(|a| a.eq_ignore_ascii_case(&q))
})
.ok_or_else(|| {
anyhow!("unknown handler '{}'; run `znippy handlers` to list available handlers", query)
})
}
pub fn print_catalog() {
let handlers = builtin_handlers();
println!("Package handlers ({}):\n", handlers.len());
for h in &handlers {
let m = h.meta();
let aliases = if m.aliases.is_empty() {
String::new()
} else {
format!(" (aliases: {})", m.aliases.join(", "))
};
println!(" • {}{} [type_id {}]", m.name, aliases, m.type_id);
if !m.ecosystem.is_empty() {
println!(" ecosystem: {}", m.ecosystem);
}
if !m.extensions.is_empty() {
println!(" extensions: {}", m.extensions.join(" "));
}
if !m.description.is_empty() {
println!(" {}", m.description);
}
for c in &m.commands {
println!(" cmd `{} {}` — {}", m.name, c.name, c.about);
}
}
}