use human_repr::HumanDuration;
#[derive(Debug)]
pub struct ScopeTime {
name: String,
target: &'static str,
module_path: &'static str,
file: &'static str,
line: u32,
start: instant::Instant,
level: log::LevelFilter,
}
impl ScopeTime {
pub fn new<S: Into<String>>(
target: &'static str,
module_path: &'static str,
file: &'static str,
line: u32,
name: S,
level: log::LevelFilter,
) -> Self {
Self {
target,
module_path,
file,
line,
name: name.into(),
start: instant::Instant::now(),
level,
}
}
}
impl Drop for ScopeTime {
fn drop(&mut self) {
let time = self.start.elapsed().human_duration();
if let Some(level) = self.level.to_level() {
log::logger().log(
&log::Record::builder()
.args(format_args!("{} {}", self.name, time))
.level(level)
.target(self.target)
.module_path(Some(self.module_path))
.file(Some(self.file))
.line(Some(self.line))
.build(),
);
} else {
println!("{} took {}", self.name, time);
}
}
}
#[macro_export]
macro_rules! print_time {
($($arg:tt)+) => {
#[allow(unused_variables)]
let time = $crate::ScopeTime::new(
module_path!(),
module_path!(),
file!(),
line!(),
format!($($arg)+),
log::LevelFilter::Off
);
} ;
}
#[macro_export]
macro_rules! log_time {
(target: $target:expr, $lvl:expr, $lvl2:expr, $($arg:tt)+) => (
#[allow(unused_variables)]
let time = if $crate::log_enabled!($lvl) {
Some($crate::ScopeTime::new($target, module_path!(), file!(), line!(), format!($($arg)+), $lvl2) )
} else{
None
};
);
}
#[macro_export]
macro_rules! error_time {
(target: $target:expr, $($arg:tt)+) => (
$crate::log_time!(target: $target, $crate::Level::Error, $crate::LevelFilter::Error, $($arg)+)
);
($($arg:tt)+) => ($crate::log_time!(target: module_path!(), $crate::Level::Error, $crate::LevelFilter::Error, $($arg)+) )
}
#[macro_export]
macro_rules! warn_time {
(target: $target:expr, $($arg:tt)+) => (
$crate::log_time!(target: $target, $crate::Level::Warn, $crate::LevelFilter::Warn, $($arg)+)
);
($($arg:tt)+) => ($crate::log_time!(target: module_path!(), $crate::Level::Warn, $crate::LevelFilter::Warn, $($arg)+) )
}
#[macro_export]
macro_rules! info_time {
(target: $target:expr, $($arg:tt)+) => (
$crate::log_time!(target: $target, $crate::Level::Info, $crate::LevelFilter::Info, $($arg)+)
);
($($arg:tt)+) => ($crate::log_time!(target: module_path!(), $crate::Level::Info, $crate::LevelFilter::Info, $($arg)+) )
}
#[macro_export]
macro_rules! debug_time {
(target: $target:expr, $($arg:tt)+) => (
$crate::log_time!(target: $target, $crate::Level::Debug, $crate::LevelFilter::Debug, $($arg)+)
);
($($arg:tt)+) => ($crate::log_time!(target: module_path!(), $crate::Level::Debug, $crate::LevelFilter::Debug, $($arg)+) )
}
#[macro_export]
macro_rules! trace_time {
(target: $target:expr, $($arg:tt)+) => (
$crate::log_time!(target: $target, $crate::Level::Trace, $crate::LevelFilter::Trace, $($arg)+)
);
($($arg:tt)+) => ($crate::log_time!(target: module_path!(), $crate::Level::Trace, $crate::LevelFilter::Trace, $($arg)+) )
}
#[macro_export(local_inner_macros)]
macro_rules! log_enabled {
(target: $target:expr, $lvl:expr) => {{
let lvl = $lvl;
lvl <= $crate::log_crate::STATIC_MAX_LEVEL
&& lvl <= $crate::log_crate::max_level()
&& $crate::log_crate::__private_api_enabled(lvl, $target)
}};
($lvl:expr) => {
log_enabled!(target: __log_module_path!(), $lvl)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __log_format_args {
($($args:tt)*) => {
format_args!($($args)*)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __log_module_path {
() => {
module_path!()
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __log_file {
() => {
file!()
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __log_line {
() => {
line!()
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __log_key {
($($args:ident)*) => {
stringify!($($args)*)
};
($($args:expr)*) => {
$($args)*
};
}