use std::io::{Stderr, Write};
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub enum Level {
Warning = 5,
Info = 7,
Debug = 8,
}
macro_rules! debug {
($dst:ident, $($arg:tt)*) => {
if $dst.is_enabled_for_debug() {
writeln!($dst.out, $($arg)*)
} else {
Ok(())
}
};
}
macro_rules! info {
($dst:ident, $($arg:tt)*) => {
if $dst.is_enabled_for_info() {
writeln!($dst.out, $($arg)*)
} else {
Ok(())
}
};
}
#[derive(Debug)]
pub struct Logger<W: Write> {
level: Level,
pub(crate) out: W,
}
impl<W: Write> Logger<W> {
pub(crate) fn is_enabled_for_debug(&self) -> bool {
self.level >= Level::Debug
}
pub(crate) fn is_enabled_for_info(&self) -> bool {
self.level >= Level::Info
}
}
impl Logger<Stderr> {
pub fn new_stderr(level: Level) -> Self {
Self {
level,
out: std::io::stderr(),
}
}
}
#[cfg(test)]
impl Logger<Vec<u8>> {
pub(crate) fn new_vec(level: Level) -> Self {
Self {
level,
out: Vec::new(),
}
}
pub(crate) fn get_logs(&self) -> &str {
core::str::from_utf8(&self.out).unwrap()
}
}