Skip to main content

codeberg_cli/actions/release/
list.rs

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