codeberg_cli/actions/user/
info.rsuse forgejo_api::structs::UserCurrentListReposQuery;
use itertools::Itertools;
use crate::actions::GeneralArgs;
use crate::render::option::option_display;
use crate::render::spinner::spin_until_ready;
use crate::types::context::BergContext;
use clap::Parser;
#[derive(Parser, Debug)]
pub struct UserInfoArgs {}
impl UserInfoArgs {
pub async fn run(self, general_args: GeneralArgs) -> anyhow::Result<()> {
let _ = general_args;
let ctx = BergContext::new(self, general_args).await?;
present_user_info(&ctx).await?;
Ok(())
}
}
async fn present_user_info(ctx: &BergContext<UserInfoArgs>) -> anyhow::Result<()> {
let user = spin_until_ready(ctx.client.user_get_current()).await?;
let repos = ctx
.client
.user_current_list_repos(UserCurrentListReposQuery::default())
.await?;
let top_repos = repos
.iter()
.sorted_by_key(|repo| repo.stars_count.unwrap_or_default())
.rev()
.take(5)
.collect::<Vec<_>>();
let mut table = ctx.make_table();
table
.set_header(vec!["User Information"])
.add_row(vec![String::from("Username"), option_display(&user.login)])
.add_row(vec![
String::from("Followers"),
option_display(&user.followers_count),
])
.add_row(vec![
String::from("Following"),
option_display(&user.following_count),
])
.add_row(vec![String::from("Repos"), repos.len().to_string()])
.add_row(vec![
String::from("Top Repos"),
top_repos
.into_iter()
.map(|repo| {
format!(
"{}({}★)",
option_display(&repo.name),
option_display(&repo.stars_count)
)
})
.join(", "),
]);
println!("{table}", table = table.show());
Ok(())
}