rs-zero 0.1.1

Rust-first microservice framework inspired by go-zero engineering practices
Documentation
use tracing_subscriber::{EnvFilter, fmt};

use crate::core::{CoreError, CoreResult};

/// Logging configuration for rs-zero services.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LogConfig {
    /// Env filter directive, for example `info,tower_http=debug`.
    pub filter: String,
    /// Whether ANSI colors should be emitted.
    pub ansi: bool,
}

impl Default for LogConfig {
    fn default() -> Self {
        Self {
            filter: "info".to_string(),
            ansi: true,
        }
    }
}

/// Initializes a global tracing subscriber.
///
/// Calling this more than once returns `CoreError::SubscriberInit`; tests can
/// use `try_init` semantics by ignoring that specific error.
pub fn init_tracing(config: LogConfig) -> CoreResult<()> {
    let filter = EnvFilter::try_new(config.filter).unwrap_or_else(|_| EnvFilter::new("info"));
    fmt()
        .with_env_filter(filter)
        .with_ansi(config.ansi)
        .try_init()
        .map_err(|_| CoreError::SubscriberInit)
}

#[cfg(test)]
mod tests {
    use super::{LogConfig, init_tracing};

    #[test]
    fn init_tracing_is_callable() {
        let _ = init_tracing(LogConfig {
            filter: "debug".to_string(),
            ansi: false,
        });
    }
}