ghfetch 0.1.0

GitHub stats in the terminal, neofetch-style
mod api;
mod cli;
mod config;
mod data;
mod display;
mod lang_colors;

use anyhow::Result;
use clap::Parser;
use cli::{Cli, Command, UserOpts};

#[tokio::main]
async fn main() -> Result<()> {
    let cli = Cli::parse();

    let command = match (cli.command, cli.username) {
        (Some(cmd), _) => cmd,
        (None, Some(username)) => Command::User {
            username,
            opts: UserOpts::default_full(),
        },
        (None, None) => unreachable!("clap enforces arg_required_else_help"),
    };

    let token = config::resolve_token(cli.token).await;
    let client = api::client::GhClient::new(token.clone(), cli.verbose)?;

    match command {
        Command::User { username, opts } => {
            let profile = data::user::fetch_user_profile(&client, &username, &opts).await?;
            if cli.json {
                println!("{}", serde_json::to_string_pretty(&profile)?);
            } else {
                display::user::render(&profile, &opts, cli.theme, cli.no_color);
            }
        }
        Command::Repo { repo, opts } => {
            let profile = data::repo::fetch_repo_profile(&client, &repo, &opts).await?;
            if cli.json {
                println!("{}", serde_json::to_string_pretty(&profile)?);
            } else {
                display::repo::render(&profile, &opts, cli.theme, cli.no_color);
            }
        }
        Command::Org { orgname, opts } => {
            let profile = data::org::fetch_org_profile(&client, &orgname, &opts).await?;
            if cli.json {
                println!("{}", serde_json::to_string_pretty(&profile)?);
            } else {
                display::org::render(&profile, &opts, cli.theme, cli.no_color);
            }
        }
    }

    Ok(())
}