gitee_cli_rs/cmd/
extension.rs1use 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}