codeberg_cli/actions/user/
info.rs1use 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#[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}