use std::fmt::Arguments;
use crate::output::note_line;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub(crate) struct Trace {
enabled: bool,
}
impl Trace {
pub(crate) fn new(enabled: bool) -> Self {
Self { enabled }
}
pub(crate) fn is_enabled(self) -> bool {
self.enabled
}
#[cfg_attr(test, mutants::skip)]
pub(crate) fn note(self, message: Arguments<'_>) {
if self.enabled {
note_line(format_args!("dure: {message}"));
}
}
}
macro_rules! trace {
($trace:expr, $($arg:tt)*) => {{
let trace = $trace;
if trace.is_enabled() {
trace.note(::std::format_args!($($arg)*));
}
}};
}
pub(crate) use trace;
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
fn quiet_by_default() {
assert!(!Trace::default().is_enabled());
}
#[test]
fn reports_what_it_was_built_with() {
assert!(Trace::new(true).is_enabled());
assert!(!Trace::new(false).is_enabled());
}
#[test]
fn a_note_is_accepted_in_both_states() {
trace!(Trace::new(true), "enabled {}", 1);
trace!(Trace::new(false), "disabled {}", 2);
}
}