codeberg_cli/actions/release/
list.rs1use 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#[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}