#![no_std]
pub use log::{
Level, LevelFilter, Log, Metadata, MetadataBuilder, ParseLevelError, Record, RecordBuilder,
SetLoggerError, STATIC_MAX_LEVEL,
};
struct NopLogger;
impl Log for NopLogger {
fn enabled(&self, _metadata: &Metadata) -> bool {
false }
fn log(&self, _record: &Record) {
}
fn flush(&self) {
}
}
pub fn max_level() -> LevelFilter {
LevelFilter::Off }
pub fn set_max_level(_level: LevelFilter) {
}
pub fn set_logger(_logger: &'static dyn Log) -> Result<(), SetLoggerError> {
Ok(())
}
#[cfg(feature = "std")]
pub fn set_boxed_logger(_logger: Box<dyn Log>) -> Result<(), SetLoggerError> {
Ok(())
}
pub fn set_logger_racy(_logger: &'static dyn Log) -> Result<(), SetLoggerError> {
Ok(())
}
pub fn set_max_level_racy(_level: LevelFilter) {
}
pub fn logger() -> &'static dyn Log {
&NopLogger
}
#[macro_export]
macro_rules! log {
(target: $target:expr, $lvl:expr, $($arg:tt)+) => {{
}};
($lvl:expr, $($arg:tt)+) => {{
}};
}
#[macro_export]
macro_rules! error {
(target: $target:expr, $($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
($($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
}
#[macro_export]
macro_rules! warn {
(target: $target:expr, $($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
($($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
}
#[macro_export]
macro_rules! info {
(target: $target:expr, $($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
($($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
}
#[macro_export]
macro_rules! debug {
(target: $target:expr, $($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
($($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
}
#[macro_export]
macro_rules! trace {
(target: $target:expr, $($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
($($arg:tt)*) => {{ let _ = format_args!($($arg)*); }};
}
#[macro_export]
macro_rules! log_enabled {
(target: $target:expr, $lvl:expr) => {{
false }};
($lvl:expr) => {{
false }};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_log_macros() {
error!("This is an error");
warn!("This is a warning");
info!("This is info");
debug!("This is debug");
trace!("This is trace");
error!(target: "test", "This is an error with target");
warn!(target: "test", "This is a warning with target");
info!(target: "test", "This is info with target");
debug!(target: "test", "This is debug with target");
trace!(target: "test", "This is trace with target");
let x = 42;
info!("Formatted: {}", x);
debug!("Multiple: {} {}", x, "test");
}
#[test]
fn test_log_enabled() {
assert_eq!(log_enabled!(Level::Error), false);
assert_eq!(log_enabled!(target: "test", Level::Info), false);
}
#[test]
fn test_logger() {
let logger = logger();
let metadata = Metadata::builder()
.level(Level::Info)
.target("test")
.build();
assert_eq!(logger.enabled(&metadata), false);
let record = Record::builder()
.level(Level::Info)
.target("test")
.args(format_args!("test message"))
.build();
logger.log(&record); logger.flush(); }
#[test]
fn test_max_level() {
let level = max_level();
assert_eq!(level, LevelFilter::Off);
set_max_level(LevelFilter::Debug);
set_max_level_racy(LevelFilter::Info);
}
#[test]
fn test_set_logger() {
static TEST_LOGGER: NopLogger = NopLogger;
assert!(set_logger(&TEST_LOGGER).is_ok());
assert!(set_logger_racy(&TEST_LOGGER).is_ok());
}
#[test]
#[cfg(feature = "std")]
fn test_set_boxed_logger() {
let boxed_logger = Box::new(NopLogger);
assert!(set_boxed_logger(boxed_logger).is_ok());
}
#[test]
fn test_type_compatibility() {
let level = Level::Info;
let filter = LevelFilter::Debug;
assert!(level >= Level::Error); assert!(filter >= LevelFilter::Info);
let metadata = Metadata::builder()
.level(Level::Warn)
.target("test_target")
.build();
assert_eq!(metadata.level(), Level::Warn);
assert_eq!(metadata.target(), "test_target");
}
}