codeberg_cli/actions/milestone/
list.rs1use crate::render::json::JsonToStdout;
2use crate::render::option::option_display;
3use crate::render::spinner::spin_until_ready;
4use crate::types::context::BergContext;
5use crate::types::git::OwnerRepo;
6use crate::{actions::GeneralArgs, types::output::OutputMode};
7use clap::Parser;
8use forgejo_api::structs::{IssueGetMilestonesListQuery, Milestone};
9
10#[derive(Parser, Debug)]
12pub struct ListMilestonesArgs {
13 #[arg(short, long, value_name = "N", default_value_t = 5)]
15 pub count: usize,
16}
17
18impl ListMilestonesArgs {
19 pub async fn run(self, general_args: GeneralArgs) -> anyhow::Result<()> {
20 let ctx = BergContext::new(self, general_args).await?;
21
22 let OwnerRepo { repo, owner } = ctx.owner_repo()?;
23 let (_, milestones_list) = spin_until_ready(ctx.client.issue_get_milestones_list(
24 owner.as_str(),
25 repo.as_str(),
26 IssueGetMilestonesListQuery::default(),
27 ))
28 .await?;
29
30 match general_args.output_mode {
31 OutputMode::Pretty => {
32 present_milestones_list(&ctx, milestones_list);
33 }
34 OutputMode::Json => milestones_list.print_json()?,
35 }
36
37 Ok(())
38 }
39}
40
41fn present_milestones_list(ctx: &BergContext<ListMilestonesArgs>, milestones: Vec<Milestone>) {
42 let milestones_empty = milestones.is_empty();
43
44 let mut table = ctx.make_table();
45
46 table
47 .set_header(vec![format!(
48 "Milestones{}",
49 if milestones_empty {
50 " (empty)"
51 } else {
52 Default::default()
53 }
54 )])
55 .add_rows(
56 milestones
57 .into_iter()
58 .map(|milestone| vec![option_display(&milestone.title)]),
59 );
60
61 println!("{table}", table = table.show());
62}