codeberg_cli/actions/user/
info.rs

1use forgejo_api::structs::UserCurrentListReposQuery;
2use itertools::Itertools;
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::output::OutputMode;
10
11use clap::Parser;
12
13/// Display short summary of the authenticated user account
14#[derive(Parser, Debug)]
15pub struct UserInfoArgs {}
16
17impl UserInfoArgs {
18    pub async fn run(self, general_args: GeneralArgs) -> anyhow::Result<()> {
19        let ctx = BergContext::new(self, general_args).await?;
20
21        present_user_info(&ctx).await?;
22        Ok(())
23    }
24}
25
26async fn present_user_info(ctx: &BergContext<UserInfoArgs>) -> anyhow::Result<()> {
27    let user = spin_until_ready(ctx.client.user_get_current()).await?;
28    let (_, repos) = ctx
29        .client
30        .user_current_list_repos(UserCurrentListReposQuery::default())
31        .await?;
32    let top_repos = repos
33        .iter()
34        .sorted_by_key(|repo| repo.stars_count.unwrap_or_default())
35        .rev()
36        .take(5)
37        .collect::<Vec<_>>();
38
39    match ctx.general_args.output_mode {
40        OutputMode::Pretty => {
41            let mut table = ctx.make_table();
42
43            table
44                .set_header(vec!["User Information"])
45                .add_row(vec![String::from("Username"), option_display(&user.login)])
46                .add_row(vec![
47                    String::from("Followers"),
48                    option_display(&user.followers_count),
49                ])
50                .add_row(vec![
51                    String::from("Following"),
52                    option_display(&user.following_count),
53                ])
54                .add_row(vec![String::from("Repos"), repos.len().to_string()])
55                .add_row(vec![
56                    String::from("Top Repos"),
57                    top_repos
58                        .into_iter()
59                        .map(|repo| {
60                            format!(
61                                "{}({}★)",
62                                option_display(&repo.name),
63                                option_display(&repo.stars_count)
64                            )
65                        })
66                        .join(", "),
67                ]);
68
69            println!("{table}", table = table.show());
70        }
71        OutputMode::Json => {
72            user.print_json()?;
73        }
74    }
75
76    Ok(())
77}