libauthcekunit 2.0.2

Super robust CSRF token extractor with configurable retry, logging, and strict validation
Documentation

use crate::error::{AuthError, Result};
use once_cell::sync::Lazy;
use std::env;
use tracing::debug;
pub static CONFIG: Lazy<Config> = Lazy::new(|| Config::from_env().expect("Failed to load config"));
#[derive(Debug, Clone)]
pub struct Config {
    pub request_timeout_secs: u64,
    pub max_retries: u32,
    pub retry_initial_interval_ms: u64,
    pub max_redirects: u32,
    pub follow_redirects: bool,
    pub token_min_length: usize,
    pub token_max_length: usize,
    pub log_level: String,
    pub user_agent: String,
    pub email: String,
    pub password: String,
    pub login_verify_url: String,   
    pub login_verify_text: String,  
}
impl Config {
    pub fn from_env() -> Result<Self> {
        if let Ok(env_path) = env::var("LIB_CEKUNIT_AUTH_ENV_ENV_PATH") {
            dotenv::from_path(env_path).ok();
        } else {
            dotenv::dotenv().ok();
        }
        debug!("Loading environment variables (email/password hidden)");
        let parse_u64 = |key: &str, default: u64| -> u64 {
            env::var(key).ok().and_then(|v| v.parse().ok()).unwrap_or(default)
        };
        let parse_u32 = |key: &str, default: u32| -> u32 {
            env::var(key).ok().and_then(|v| v.parse().ok()).unwrap_or(default)
        };
        let parse_bool = |key: &str, default: bool| -> bool {
            env::var(key).ok().and_then(|v| v.parse().ok()).unwrap_or(default)
        };
        let parse_string = |key: &str, default: String| -> String {
            env::var(key).unwrap_or(default)
        };
        Ok(Config {
            request_timeout_secs: parse_u64("LIB_CEKUNIT_AUTH_ENV_TIMEOUT_SECS", 30),
            max_retries: parse_u32("LIB_CEKUNIT_AUTH_ENV_MAX_RETRIES", 3),
            retry_initial_interval_ms: parse_u64("LIB_CEKUNIT_AUTH_ENV_RETRY_INITIAL_MS", 500),
            max_redirects: parse_u32("LIB_CEKUNIT_AUTH_ENV_MAX_REDIRECTS", 5),
            follow_redirects: parse_bool("LIB_CEKUNIT_AUTH_ENV_FOLLOW_REDIRECTS", true),
            token_min_length: parse_u64("LIB_CEKUNIT_AUTH_ENV_TOKEN_MIN_LEN", 10)
                .try_into()
                .map_err(|_| AuthError::Config("min length too large".into()))?,
            token_max_length: parse_u64("LIB_CEKUNIT_AUTH_ENV_TOKEN_MAX_LEN", 1024)
                .try_into()
                .map_err(|_| AuthError::Config("max length too large".into()))?,
            log_level: parse_string("RUST_LOG", "info".to_string()),
            user_agent: parse_string("LIB_CEKUNIT_AUTH_ENV_USER_AGENT", "LIB_CEKUNIT_AUTH_ENVUnit/2.0".to_string()),
            email: parse_string("LIB_CEKUNIT_AUTH_ENV_EMAIL", "".to_string()),
            password: parse_string("LIB_CEKUNIT_AUTH_ENV_PASSWORD", "".to_string()),
            login_verify_url: parse_string("LIB_CEKUNIT_AUTH_ENV_LOGIN_VERIFY_URL", "/dashboard".to_string()),
            login_verify_text: parse_string("LIB_CEKUNIT_AUTH_ENV_LOGIN_VERIFY_TEXT", "".to_string()),
        })
    }
}