codeberg_cli/actions/repo/
info.rs

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