censer 0.1.0

Beautiful, structured logging for the terminal ⚒️
Documentation
//! # Smelt
//!
//! Beautiful, structured logging for the terminal.
//!
//! Smelt is the Rust equivalent of [log](https://github.com/charmbracelet/log)
//! from Charmbracelet. It provides gorgeous, human-readable log output.
//!
//! ## Quick Start
//!
//! ```rust
//! use smelt::{info, warn, error, debug, Logger};
//!
//! // Quick logging
//! info!("Server started");
//! warn!("Low disk space");
//! error!("Connection failed");
//!
//! // With key-value pairs
//! info!("Request received"; "method" => "GET", "path" => "/api/users");
//!
//! // Custom logger
//! let logger = Logger::new()
//!     .with_timestamp()
//!     .with_icons();
//!
//! logger.info("Application started");
//! ```

#![warn(missing_docs)]
#![warn(clippy::all)]
#![deny(unsafe_code)]

mod level;
mod logger;
mod style;

pub use level::Level;
pub use logger::Logger;
pub use style::LogStyle;

use std::sync::OnceLock;

static GLOBAL_LOGGER: OnceLock<Logger> = OnceLock::new();

/// Get or initialize the global logger.
pub fn global_logger() -> &'static Logger {
    GLOBAL_LOGGER.get_or_init(Logger::default)
}

/// Log at info level.
#[macro_export]
macro_rules! info {
    ($msg:expr) => {
        $crate::global_logger().info($msg)
    };
    ($msg:expr; $($key:expr => $value:expr),+ $(,)?) => {
        $crate::global_logger().info_kv($msg, &[$(($key, &$value)),+])
    };
}

/// Log at warn level.
#[macro_export]
macro_rules! warn {
    ($msg:expr) => {
        $crate::global_logger().warn($msg)
    };
    ($msg:expr; $($key:expr => $value:expr),+ $(,)?) => {
        $crate::global_logger().warn_kv($msg, &[$(($key, &$value)),+])
    };
}

/// Log at error level.
#[macro_export]
macro_rules! error {
    ($msg:expr) => {
        $crate::global_logger().error($msg)
    };
    ($msg:expr; $($key:expr => $value:expr),+ $(,)?) => {
        $crate::global_logger().error_kv($msg, &[$(($key, &$value)),+])
    };
}

/// Log at debug level.
#[macro_export]
macro_rules! debug {
    ($msg:expr) => {
        $crate::global_logger().debug($msg)
    };
    ($msg:expr; $($key:expr => $value:expr),+ $(,)?) => {
        $crate::global_logger().debug_kv($msg, &[$(($key, &$value)),+])
    };
}

/// Log at fatal level.
#[macro_export]
macro_rules! fatal {
    ($msg:expr) => {
        $crate::global_logger().fatal($msg)
    };
    ($msg:expr; $($key:expr => $value:expr),+ $(,)?) => {
        $crate::global_logger().fatal_kv($msg, &[$(($key, &$value)),+])
    };
}

/// Prelude for convenient imports.
pub mod prelude {
    pub use crate::{debug, error, fatal, global_logger, info, warn, Level, LogStyle, Logger};
}