1use anyhow::{Result, anyhow};
20use znippy_common::plugin::ArchiveTypePlugin;
21use znippy_common::plugins::cargo_native::CargoPlugin;
22use znippy_common::plugins::conda_native::CondaPlugin;
23use znippy_common::plugins::deb_native::DebPlugin;
24use znippy_common::plugins::gem_native::GemPlugin;
25use znippy_common::plugins::npm_native::NpmPlugin;
26use znippy_common::plugins::rpm_native::RpmPlugin;
27use znippy_plugin_git::NativeGitPlugin;
28use znippy_plugin_maven::NativeMavenPlugin;
29use znippy_plugin_media::NativeMediaPlugin;
30use znippy_plugin_python::NativePythonPlugin;
31use znippy_plugin_rust_toolchain::NativeRustToolchainPlugin;
32use znippy_plugin_skidbladnir::NativeSkidbladnirPlugin;
33
34pub fn builtin_handlers() -> Vec<Box<dyn ArchiveTypePlugin>> {
37 let mut handlers: Vec<Box<dyn ArchiveTypePlugin>> = vec![
38 Box::new(CargoPlugin::new()),
39 Box::new(NativePythonPlugin),
40 Box::new(NativeMavenPlugin),
41 Box::new(NpmPlugin),
42 Box::new(GemPlugin),
43 Box::new(CondaPlugin),
44 Box::new(RpmPlugin),
45 Box::new(DebPlugin),
46 Box::new(NativeMediaPlugin::new()),
47 Box::new(NativeSkidbladnirPlugin::new()),
48 Box::new(NativeRustToolchainPlugin::new()),
49 Box::new(NativeGitPlugin::new()),
50 ];
51 handlers.extend(znippy_common::plugins::skeletons::skeleton_handlers());
52 handlers.sort_by_key(|h| h.type_id());
53 handlers
54}
55
56pub fn find_handler(query: &str) -> Result<Box<dyn ArchiveTypePlugin>> {
58 let q = query.to_ascii_lowercase();
59 builtin_handlers()
60 .into_iter()
61 .find(|h| {
62 let m = h.meta();
63 m.name.eq_ignore_ascii_case(&q) || m.aliases.iter().any(|a| a.eq_ignore_ascii_case(&q))
64 })
65 .ok_or_else(|| {
66 anyhow!("unknown handler '{}'; run `znippy handlers` to list available handlers", query)
67 })
68}
69
70pub fn print_catalog() {
72 let handlers = builtin_handlers();
73 println!("Package handlers ({}):\n", handlers.len());
74 for h in &handlers {
75 let m = h.meta();
76 let aliases = if m.aliases.is_empty() {
77 String::new()
78 } else {
79 format!(" (aliases: {})", m.aliases.join(", "))
80 };
81 println!(" • {}{} [type_id {}]", m.name, aliases, m.type_id);
82 if !m.ecosystem.is_empty() {
83 println!(" ecosystem: {}", m.ecosystem);
84 }
85 if !m.extensions.is_empty() {
86 println!(" extensions: {}", m.extensions.join(" "));
87 }
88 if !m.description.is_empty() {
89 println!(" {}", m.description);
90 }
91 for c in &m.commands {
92 println!(" cmd `{} {}` — {}", m.name, c.name, c.about);
93 }
94 }
95}