codeberg_cli/actions/user/
info.rs1use forgejo_api::structs::UserCurrentListReposQuery;
2use itertools::Itertools;
3
4use crate::actions::GeneralArgs;
5use crate::render::option::option_display;
6use crate::render::spinner::spin_until_ready;
7use crate::types::context::BergContext;
8
9use clap::Parser;
10
11#[derive(Parser, Debug)]
13pub struct UserInfoArgs {}
14
15impl UserInfoArgs {
16 pub async fn run(self, general_args: GeneralArgs) -> anyhow::Result<()> {
17 let _ = general_args;
18 let ctx = BergContext::new(self, general_args).await?;
19
20 present_user_info(&ctx).await?;
21 Ok(())
22 }
23}
24
25async fn present_user_info(ctx: &BergContext<UserInfoArgs>) -> anyhow::Result<()> {
26 let user = spin_until_ready(ctx.client.user_get_current()).await?;
27 let repos = ctx
28 .client
29 .user_current_list_repos(UserCurrentListReposQuery::default())
30 .await?;
31 let top_repos = repos
32 .iter()
33 .sorted_by_key(|repo| repo.stars_count.unwrap_or_default())
34 .rev()
35 .take(5)
36 .collect::<Vec<_>>();
37
38 let mut table = ctx.make_table();
39
40 table
41 .set_header(vec!["User Information"])
42 .add_row(vec![String::from("Username"), option_display(&user.login)])
43 .add_row(vec![
44 String::from("Followers"),
45 option_display(&user.followers_count),
46 ])
47 .add_row(vec![
48 String::from("Following"),
49 option_display(&user.following_count),
50 ])
51 .add_row(vec![String::from("Repos"), repos.len().to_string()])
52 .add_row(vec![
53 String::from("Top Repos"),
54 top_repos
55 .into_iter()
56 .map(|repo| {
57 format!(
58 "{}({}★)",
59 option_display(&repo.name),
60 option_display(&repo.stars_count)
61 )
62 })
63 .join(", "),
64 ]);
65
66 println!("{table}", table = table.show());
67
68 Ok(())
69}