gitee_cli_rs/cmd/
label.rs1use 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
9pub 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}