Skip to main content

oxi/cli/commands/
ext.rs

1//! Extension subcommand handler.
2
3use crate::cli::ExtCommands;
4use anyhow::Result;
5
6/// Handle `oxi ext …` subcommands.
7pub 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}