codeberg_cli/actions/repo/
info.rs1use 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#[derive(Parser, Debug)]
18pub struct RepoInfoArgs {
19 #[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}