codeberg_cli/actions/release/
list.rs

1use forgejo_api::structs::{Release, RepoListReleasesQuery};
2
3use crate::actions::GlobalArgs;
4use crate::render::json::JsonToStdout;
5use crate::render::option::option_display;
6use crate::render::spinner::spin_until_ready;
7use crate::types::context::BergContext;
8use crate::types::git::OwnerRepo;
9
10use clap::Parser;
11
12/// List all releases in the current repository
13#[derive(Parser, Debug)]
14pub struct ListReleaseArgs;
15
16impl ListReleaseArgs {
17    pub async fn run(self, global_args: GlobalArgs) -> anyhow::Result<()> {
18        let ctx = BergContext::new(self, global_args).await?;
19        let OwnerRepo { repo, owner } = ctx.owner_repo()?;
20        let (_, releases_list) = spin_until_ready(
21            ctx.client
22                .repo_list_releases(
23                    owner.as_str(),
24                    repo.as_str(),
25                    RepoListReleasesQuery {
26                        ..Default::default()
27                    },
28                )
29                .send(),
30        )
31        .await?;
32
33        match ctx.global_args.output_mode {
34            crate::types::output::OutputMode::Pretty => {
35                present_releases_list(&ctx, releases_list);
36            }
37            crate::types::output::OutputMode::Json => {
38                releases_list.print_json()?;
39            }
40        }
41
42        Ok(())
43    }
44}
45
46fn present_releases_list(ctx: &BergContext<ListReleaseArgs>, releases: Vec<Release>) {
47    let releases_empty = releases.is_empty();
48
49    let mut table = ctx.make_table().add_table((!releases_empty).then(|| {
50        let mut inner_table = ctx.make_table();
51        inner_table
52            .set_header(vec!["ID", "Name", "Tag", "Published At"])
53            .add_rows(releases.into_iter().map(|release| {
54                let Release {
55                    id,
56                    name,
57                    tag_name,
58                    published_at,
59                    ..
60                } = release;
61                vec![
62                    option_display(&id),
63                    option_display(&name),
64                    option_display(&tag_name),
65                    option_display(&published_at),
66                ]
67            }));
68        inner_table
69    }));
70
71    table.set_header(vec![format!(
72        "Releases{}",
73        if releases_empty {
74            " (empty)"
75        } else {
76            Default::default()
77        }
78    )]);
79
80    println!("{table}", table = table.show());
81}