Skip to main content

gitee_cli_rs/cmd/
label.rs

1use std::io::Write;
2
3use super::{confirm, Ctx};
4use crate::api::labels::{CreateLabel, EditLabel};
5use crate::cli::LabelCmd;
6use crate::error::Result;
7use crate::out;
8
9// Follow-up (ticket 08 non-goal): `gh label clone` cross-repo copy is not implemented.
10pub fn execute(ctx: &Ctx, cmd: LabelCmd) -> Result<()> {
11    match cmd {
12        LabelCmd::List { limit } => {
13            let repo = ctx.repo()?;
14            let items = ctx.client.labels(repo).list(limit.limit)?;
15            let mut out = std::io::stdout().lock();
16            ctx.out
17                .render(&mut out, &items, |w| out::label_table(w, &items))?;
18        }
19        LabelCmd::Create { name, color } => {
20            let repo = ctx.repo()?;
21            if ctx.preview {
22                println!("{}", super::preview_line(
23                    &format!("create label {name}"),
24                    &[
25                        ("repo", &format!("{}/{}", repo.owner, repo.name)),
26                        ("color", &color),
27                    ],
28                ));
29                return Ok(());
30            }
31            let change = ctx.client.labels(repo).create_idempotent(&CreateLabel {
32                name: &name,
33                color: &color,
34            })?;
35            let mut out = std::io::stdout().lock();
36            match change {
37                crate::api::StateChange::Already(label) => {
38                    writeln!(out, "Label {name} already exists (color {})", label.color.as_deref().unwrap_or("(none)"))?;
39                }
40                crate::api::StateChange::Changed(label) => {
41                    let items = [label];
42                    ctx.out
43                        .render(&mut out, &items, |w| out::label_table(w, &items))?;
44                }
45            }
46        }
47        LabelCmd::Edit {
48            name,
49            new_name,
50            color,
51        } => {
52            let repo = ctx.repo()?;
53            let label = ctx.client.labels(repo).edit(
54                &name,
55                &EditLabel {
56                    name: new_name.as_deref(),
57                    color: color.as_deref(),
58                },
59            )?;
60            let items = [label];
61            let mut out = std::io::stdout().lock();
62            ctx.out
63                .render(&mut out, &items, |w| out::label_table(w, &items))?;
64        }
65        LabelCmd::Delete { name, yes } => {
66            let repo = ctx.repo()?;
67            confirm(&format!("Delete label {name}"), yes)?;
68            ctx.client.labels(repo).delete(&name)?;
69            writeln!(std::io::stdout().lock(), "Deleted label {name}")?;
70        }
71    }
72    Ok(())
73}