o402 0.1.2

OpenAI-compatible gateway, paid with x402.
//! JSON or pretty tracing. `RUST_LOG` wins over `observability.level`.

use tracing_subscriber::EnvFilter;

use crate::config::{ConfigError, LogFormat, ObservabilityConfig};

/// Install the global subscriber. A second call is ignored (tests).
///
/// # Errors
///
/// Returns [`ConfigError::Validation`] when `RUST_LOG` or `observability.level`
/// is not a valid [`EnvFilter`] directive.
pub(crate) fn init(obs: &ObservabilityConfig) -> Result<(), ConfigError> {
    let filter = env_filter(&obs.level)?;
    match obs.format {
        LogFormat::Json => tracing_subscriber::fmt()
            .with_env_filter(filter)
            .json()
            .try_init(),
        LogFormat::Pretty => tracing_subscriber::fmt()
            .with_env_filter(filter)
            .pretty()
            .try_init(),
    }
    .ok();
    Ok(())
}

fn env_filter(level: &str) -> Result<EnvFilter, ConfigError> {
    let (what, spec) = std::env::var("RUST_LOG").map_or_else(
        |_| ("observability.level", level.to_owned()),
        |spec| ("RUST_LOG", spec),
    );
    EnvFilter::try_new(&spec)
        .map_err(|error| ConfigError::Validation(format!("invalid {what} '{spec}': {error}")))
}