1use crate::cli::ExtCommands;
4use anyhow::Result;
5
6pub async fn handle_ext(action: &ExtCommands) -> Result<()> {
8 use crate::extensions::ext_cli;
9
10 match action {
11 ExtCommands::Install { source, prerelease } => {
12 let result = ext_cli::install_extension(source, *prerelease).await?;
13 println!(
14 "Installed {} v{} from {}",
15 result.name, result.version, result.source
16 );
17 }
18 ExtCommands::List => {
19 let entries = ext_cli::list_extensions()?;
20 if entries.is_empty() {
21 println!("No extensions installed.");
22 println!("Install with: oxi ext install owner/repo");
23 } else {
24 println!("Installed extensions:\n");
25 for (source, entry) in &entries {
26 let name = entry
27 .wasm_file
28 .strip_suffix(".wasm")
29 .unwrap_or(&entry.wasm_file);
30 println!(
31 " {} v{} — {} ({})",
32 source,
33 entry.version,
34 name,
35 entry.installed_at.split('T').next().unwrap_or("?")
36 );
37 }
38 println!("\n{} extension(s)", entries.len());
39 }
40 }
41 ExtCommands::Remove { source } => {
42 ext_cli::remove_extension(source)?;
43 println!("Removed extension: {}", source);
44 }
45 ExtCommands::Update { source } => {
46 let results = ext_cli::update_extension(source.as_deref()).await?;
47 if results.is_empty() {
48 println!("Nothing to update.");
49 } else {
50 for r in &results {
51 println!("Updated {} to {}", r.source, r.version);
52 }
53 }
54 }
55 ExtCommands::Info { source } => {
56 ext_cli::info_extension(source).await?;
57 }
58 }
59 Ok(())
60}