pub type AssertLevel = log::LevelFilter;
#[cfg(feature = "off")]
pub const STATIC_MAX_LEVEL: AssertLevel = log::LevelFilter::Off;
#[cfg(feature = "error")]
pub const STATIC_MAX_LEVEL: AssertLevel = log::LevelFilter::Error;
#[cfg(feature = "warn")]
pub const STATIC_MAX_LEVEL: AssertLevel = log::LevelFilter::Warn;
#[cfg(feature = "info")]
pub const STATIC_MAX_LEVEL: AssertLevel = log::LevelFilter::Info;
#[cfg(feature = "debug")]
pub const STATIC_MAX_LEVEL: AssertLevel = log::LevelFilter::Debug;
#[cfg(all(not(feature = "error"), not(feature = "warn"), not(feature = "info"), not(feature = "debug"), not(feature = "off")))]
pub const STATIC_MAX_LEVEL: AssertLevel = log::LevelFilter::Trace;
static mut MAX_LEVEL: AssertLevel = AssertLevel::Trace;
pub fn set_max_level(level: AssertLevel) {
unsafe {
MAX_LEVEL = level;
}
}
pub fn max_level() -> AssertLevel {
unsafe { MAX_LEVEL }
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct AssertConfig {
assertion_level: AssertLevel,
}
impl AssertConfig {
pub fn new(assertion_level: AssertLevel) -> Self {
Self { assertion_level }
}
pub fn assertion_level(&self) -> AssertLevel {
self.assertion_level
}
}
#[macro_export]
macro_rules! eassert {
($config:expr; $($arg:tt)*) =>(
if $crate::AssertLevel::Error <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Error <= $crate::max_level()
&& $crate::AssertLevel::Error <= $config.assertion_level() { assert!($($arg)*); });
($($arg:tt)*) => (if $crate::AssertLevel::Error <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Error <= $crate::max_level() { assert!($($arg)*); });
}
#[macro_export]
macro_rules! wassert {
($config:expr; $($arg:tt)*) =>(
if $crate::AssertLevel::Warn <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Warn <= $crate::max_level()
&& $crate::AssertLevel::Warn <= $config.assertion_level() { assert!($($arg)*); });
($($arg:tt)*) => (if $crate::AssertLevel::Warn <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Warn <= $crate::max_level() { assert!($($arg)*); })
}
#[macro_export]
macro_rules! iassert {
($config:expr; $($arg:tt)*) =>(
if $crate::AssertLevel::Info <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Info <= $crate::max_level()
&& $crate::AssertLevel::Info <= $config.assertion_level() { assert!($($arg)*); });
($($arg:tt)*) => (if $crate::AssertLevel::Info <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Info <= $crate::max_level() { assert!($($arg)*); })
}
#[macro_export]
macro_rules! dassert {
($config:expr; $($arg:tt)*) =>(
if $crate::AssertLevel::Debug <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Debug <= $crate::max_level()
&& $crate::AssertLevel::Debug <= $config.assertion_level() { assert!($($arg)*); });
($($arg:tt)*) => (if $crate::AssertLevel::Debug <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Debug <= $crate::max_level() { assert!($($arg)*); })
}
#[macro_export]
macro_rules! tassert {
($config:expr; $($arg:tt)*) =>(
if $crate::AssertLevel::Trace <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Trace <= $crate::max_level()
&& $crate::AssertLevel::Trace <= $config.assertion_level() { assert!($($arg)*); });
($($arg:tt)*) => (if $crate::AssertLevel::Trace <= $crate::STATIC_MAX_LEVEL
&& $crate::AssertLevel::Trace <= $crate::max_level() { assert!($($arg)*); })
}
#[cfg(test)]
mod tests {
use crate::dassert;
#[test]
fn it_works() {
let result = 2 + 2;
dassert!(result == 4);
log::info!("{}", result);
}
#[test]
#[should_panic]
fn it_crashes() {
let result = 2 + 2;
dassert!(result == 5);
log::info!("{}", result);
}
#[test]
fn config_sanity() {
let result = 2 + 2;
let config = crate::AssertConfig {
assertion_level: crate::AssertLevel::Error,
};
eassert!(config; result == 4);
log::info!("{}", result);
}
#[test]
#[should_panic]
fn config_crashes() {
let result = 2 + 2;
let config = crate::AssertConfig {
assertion_level: crate::AssertLevel::Warn,
};
eassert!(config; result == 3);
log::info!("{}", result);
}
#[test]
fn config_filters() {
let result = 2 + 3;
let config = crate::AssertConfig {
assertion_level: crate::AssertLevel::Warn,
};
iassert!(config; result == 4);
log::info!("{}", result);
}
#[test]
fn max_level_filters() {
let result = 2 + 3;
crate::set_max_level(crate::AssertLevel::Warn);
iassert!(result == 4);
log::info!("{}", result);
}
#[test]
#[should_panic]
fn max_level_sanity() {
let result = 2 + 3;
crate::set_max_level(crate::AssertLevel::Error);
eassert!(result == 4);
log::info!("{}", result);
}
}