hackatime 0.2.0

Terminal CLI for viewing Hackatime stats with OAuth login
use anyhow::{Context, Result};

pub const DEFAULT_CLIENT_ID: &str = "s9UiFixvPuLjs9ClHeg4HItID3X63j76XFY7AG_WEzk";
pub const DEFAULT_REDIRECT_URI: &str = "http://127.0.0.1:8787/callback";
pub const DEFAULT_SCOPES: &str = "profile read";

#[derive(Clone, Debug)]
pub struct AppConfig {
    pub client_id: String,
    pub redirect_uri: String,
    pub scopes: String,
}

impl AppConfig {
    pub fn load() -> Result<Self> {
        let _ = dotenvy::dotenv();

        let client_id =
            std::env::var("HACKATIME_CLIENT_ID").unwrap_or_else(|_| DEFAULT_CLIENT_ID.to_string());
        let redirect_uri = std::env::var("HACKATIME_REDIRECT_URI")
            .unwrap_or_else(|_| DEFAULT_REDIRECT_URI.to_string());
        let scopes =
            std::env::var("HACKATIME_SCOPES").unwrap_or_else(|_| DEFAULT_SCOPES.to_string());

        if client_id.trim().is_empty() {
            anyhow::bail!("HACKATIME_CLIENT_ID is empty");
        }

        url::Url::parse(&redirect_uri)
            .with_context(|| format!("invalid HACKATIME_REDIRECT_URI: {redirect_uri}"))?;

        Ok(Self {
            client_id,
            redirect_uri,
            scopes,
        })
    }
}