syn_crabs 0.2.0

A lightweight and configurable logging library with color-coded output for Rust applications.
Documentation
/// # Colorful Logging for your Rustian goodness
/// 
/// ### Initializes the logger with colored output and configurable log levels.
///
/// # Errors
///
/// Returns an `Err` if the log level provided in the `RUST_LOG` environment variable
/// cannot be parsed.
///
/// # Example
///
/// ```rust
/// use logalicious_rs::setup_logging;
///
/// fn main() {
///     setup_logging().expect("Failed to initialize logging");
///     log::info!("This is an info message");
///     log::error!("This is an error message");
/// }
/// 
///
/// The log level can be set via the `RUST_LOG` environment variable:
/// RUST_LOG=debug cargo run


use chrono::Local;
use colored::*;
use env_logger::Builder;
use log::LevelFilter;
use std::env;
use std::io::Write;

pub fn setup_logging(verbose: bool, quiet: bool) -> Result<(), Box<dyn std::error::Error>> {
    // Determine log level based on flags
    let log_level: LevelFilter = if quiet {
        LevelFilter::Off
    } else if verbose {
        LevelFilter::Debug
    } else {
        // Default log level is INFO, otherwise RUST_LOG env var is used
        env::var("RUST_LOG")
            .unwrap_or_else(|_| "info".to_string())
            .parse()?
    };

    Builder::new()
        .filter(None, log_level)
        .format(|buf, record| {
            let level = match record.level() {
                log::Level::Error => "ERROR".red(),
                log::Level::Warn => "WARN".yellow(),
                log::Level::Info => "INFO".green(),
                log::Level::Debug => "DEBUG".blue(),
                log::Level::Trace => "TRACE".purple(),
            };

            writeln!(
                buf,
                "{} [{}] - {}",
                Local::now().format("%Y-%m-%d %H:%M:%S"),
                level,
                record.args()
            )
        })
        .init();

    Ok(())
}