Skip to main content

gitee_cli_rs/cmd/
extension.rs

1use std::io::Write;
2
3use super::Ctx;
4use crate::cli::ExtensionCmd;
5use crate::error::Result;
6use crate::extension;
7use serde::Serialize;
8
9#[derive(Serialize)]
10struct ExtensionEntry {
11    name: String,
12}
13
14pub fn execute(ctx: &Ctx, cmd: ExtensionCmd) -> Result<()> {
15    match cmd {
16        ExtensionCmd::List => {
17            let mut names = extension::list_on_path();
18            for n in extension::list_installed()? {
19                if !names.contains(&n) {
20                    names.push(n);
21                }
22            }
23            names.sort();
24            names.dedup();
25            let items: Vec<ExtensionEntry> = names
26                .into_iter()
27                .map(|name| ExtensionEntry { name })
28                .collect();
29            let mut out = std::io::stdout().lock();
30            ctx.out.render(&mut out, &items, |w| {
31                if items.is_empty() {
32                    writeln!(w, "(no extensions)")?;
33                } else {
34                    for item in &items {
35                        writeln!(w, "{}", item.name)?;
36                    }
37                }
38                Ok(())
39            })?;
40        }
41        ExtensionCmd::Install { repo, build, yes } => {
42            extension::install(&repo, build.as_deref(), yes, &ctx.host)?;
43        }
44        ExtensionCmd::Create { name, cargo } => {
45            extension::create(&name, cargo)?;
46        }
47        ExtensionCmd::Remove { name, yes } => {
48            extension::remove(&name, yes)?;
49        }
50        ExtensionCmd::Upgrade { name } => {
51            extension::upgrade(name.as_deref())?;
52        }
53    }
54    Ok(())
55}