codeberg_cli/actions/repo/
info.rs

1use anyhow::Context;
2use forgejo_api::structs::Repository;
3
4use crate::actions::GeneralArgs;
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;
10use crate::types::output::OutputMode;
11
12use super::parse_owner_and_repo;
13
14use clap::Parser;
15
16/// Display short summary of the current repository
17#[derive(Parser, Debug)]
18pub struct RepoInfoArgs {
19    /// Repository to be queried for information, defaults to repo in $pwd if there is any
20    #[arg(value_name = "OWNER/REPO")]
21    pub owner_and_repo: Option<String>,
22}
23
24impl RepoInfoArgs {
25    pub async fn run(self, general_args: GeneralArgs) -> anyhow::Result<()> {
26        let ctx = BergContext::new(self, general_args).await?;
27
28        let (owner, repo) = ctx
29            .args
30            .owner_and_repo
31            .as_ref()
32            .and_then(|s| parse_owner_and_repo(s).ok())
33            .unwrap_or(
34                ctx.owner_repo()
35                    .map(|OwnerRepo { repo, owner }| (owner, repo))?,
36            );
37        let repo_data = spin_until_ready(ctx.client.repo_get(owner.as_str(), repo.as_str()))
38            .await
39            .context("Current repo not found on this instance.")?;
40
41        match general_args.output_mode {
42            OutputMode::Pretty => {
43                present_repo_info(&ctx, repo_data);
44            }
45            OutputMode::Json => repo_data.print_json()?,
46        }
47
48        Ok(())
49    }
50}
51
52fn present_repo_info(ctx: &BergContext<RepoInfoArgs>, repo_data: Repository) {
53    let mut table = ctx.make_table();
54
55    table
56        .set_header(vec!["Repository Info"])
57        .add_row(vec![
58            String::from("Repository Name"),
59            option_display(&repo_data.name),
60        ])
61        .add_row(vec![
62            String::from("Repository Owner"),
63            option_display(
64                &repo_data
65                    .owner
66                    .as_ref()
67                    .and_then(|user| user.login.as_ref()),
68            ),
69        ])
70        .add_row(vec![
71            String::from("Stars"),
72            format!("{}★", option_display(&repo_data.stars_count)),
73        ]);
74
75    println!("{table}", table = table.show());
76}