diff --git a/tracing-core/src/field.rs b/tracing-core/src/field.rs index 741c0ff262..20aa860217 100644 --- a/tracing-core/src/field.rs +++ b/tracing-core/src/field.rs @@ -266,6 +266,13 @@ pub trait Value: crate::sealed::Sealed { #[derive(Clone)] pub struct DisplayValue(T); +/// A `Value` which serializes using alternate `fmt::Display`. +/// +/// Uses `record_debug` in the `Value` implementation to +/// avoid an unnecessary evaluation. +#[derive(Clone)] +pub struct DisplayAltValue(T); + /// A `Value` which serializes as a string using `fmt::Debug`. #[derive(Clone)] pub struct DebugValue(T); @@ -279,6 +286,15 @@ where DisplayValue(t) } +/// Wraps a type implementing `fmt::Display` as a `Value` that can be +/// recorded using its alternate `Display` implementation. +pub fn display_alt(t: T) -> DisplayAltValue +where + T: fmt::Display, +{ + DisplayAltValue(t) +} + /// Wraps a type implementing `fmt::Debug` as a `Value` that can be /// recorded using its `Debug` implementation. pub fn debug(t: T) -> DebugValue @@ -639,6 +655,31 @@ impl fmt::Display for DisplayValue { } } +// ===== impl DisplayAltValue ===== + +impl crate::sealed::Sealed for DisplayAltValue {} + +impl Value for DisplayAltValue +where + T: fmt::Display, +{ + fn record(&self, key: &Field, visitor: &mut dyn Visit) { + visitor.record_debug(key, self) + } +} + +impl fmt::Debug for DisplayAltValue { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(&format_args!("{:#}", self), f) + } +} + +impl fmt::Display for DisplayAltValue { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + format_args!("{:#}", self.0).fmt(f) + } +} + // ===== impl DebugValue ===== impl crate::sealed::Sealed for DebugValue {} @@ -1197,4 +1238,32 @@ mod test { }); assert_eq!(result, format!("{}", r#"[61 62 63]" "[c0 ff ee]"#)); } + + #[test] + fn display_alt_value() { + struct AlternateString<'a>(&'a str); + + impl std::fmt::Display for AlternateString<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if f.alternate() { + write!(f, "{} with alternate", self.0) + } else { + self.0.fmt(f) + } + } + } + + let alt_str = AlternateString("hello world"); + + let display = "hello world"; + assert_eq!(display, format!("{}", &alt_str)); + + let alt_display = "hello world with alternate"; + assert_eq!(alt_display, format!("{:#}", &alt_str)); + + assert_eq!(alt_display, format!("{}", display_alt(&alt_str))); + assert_eq!(alt_display, format!("{:#}", display_alt(&alt_str))); + assert_eq!(alt_display, format!("{:?}", display_alt(&alt_str))); + assert_eq!(alt_display, format!("{:#?}", display_alt(&alt_str))); + } } diff --git a/tracing/src/macros.rs b/tracing/src/macros.rs index 21cb04c83e..f363533f56 100644 --- a/tracing/src/macros.rs +++ b/tracing/src/macros.rs @@ -968,6 +968,14 @@ macro_rules! event { { %$($k).+ = $($field)*} ) ); + (parent: $parent:expr, $lvl:expr, %%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $lvl, + { %%$($k).+ = $($field)*} + ) + ); (parent: $parent:expr, $lvl:expr, $($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -984,6 +992,14 @@ macro_rules! event { { %$($k).+, $($field)*} ) ); + (parent: $parent:expr, $lvl:expr, %%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $lvl, + { %%$($k).+, $($field)*} + ) + ); (parent: $parent:expr, $lvl:expr, ?$($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -1032,12 +1048,22 @@ macro_rules! event { { %$($k).+, $($field)*} ) ); + ($lvl:expr, %%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $lvl, + { %%$($k).+, $($field)*} + ) + ); ($lvl:expr, ?$($k:ident).+) => ( $crate::event!($lvl, ?$($k).+,) ); ($lvl:expr, %$($k:ident).+) => ( $crate::event!($lvl, %$($k).+,) ); + ($lvl:expr, %%$($k:ident).+) => ( + $crate::event!($lvl, %%$($k).+,) + ); ($lvl:expr, $($k:ident).+) => ( $crate::event!($lvl, $($k).+,) ); @@ -1342,6 +1368,9 @@ macro_rules! trace { (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, {}, $($arg)+) ); @@ -1359,6 +1388,9 @@ macro_rules! trace { (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, $crate::Level::TRACE, {}, $($arg)+) ); @@ -1376,6 +1408,9 @@ macro_rules! trace { (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { %$($k).+ $($field)* }) ); + (target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { %%$($k).+ $($field)* }) + ); (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, {}, $($arg)+) ); @@ -1393,6 +1428,9 @@ macro_rules! trace { (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { %$($k).+ $($field)* }) ); + (name: $name:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { %%$($k).+ $($field)* }) + ); (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, {}, $($arg)+) ); @@ -1410,6 +1448,9 @@ macro_rules! trace { (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, $crate::Level::TRACE, { %$($k).+ $($field)* }) ); + (name: $name:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, $crate::Level::TRACE, { %%$($k).+ $($field)* }) + ); (name: $name:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, $crate::Level::TRACE, {}, $($arg)+) ); @@ -1427,6 +1468,9 @@ macro_rules! trace { (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, $crate::Level::TRACE, { %$($k).+ $($field)* }) ); + (target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::TRACE, { %%$($k).+ $($field)* }) + ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::TRACE, {}, $($arg)+) ); @@ -1465,6 +1509,14 @@ macro_rules! trace { { %$($k).+ = $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::TRACE, + { %%$($k).+ = $($field)*} + ) + ); (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -1489,6 +1541,14 @@ macro_rules! trace { { %$($k).+, $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::TRACE, + { %%$($k).+, $($field)*} + ) + ); (parent: $parent:expr, $($arg:tt)+) => ( $crate::event!( target: module_path!(), @@ -1529,6 +1589,13 @@ macro_rules! trace { { %$($k).+ = $($field)*} ) ); + (%%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::TRACE, + { %%$($k).+ = $($field)*} + ) + ); ($($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -1550,6 +1617,13 @@ macro_rules! trace { { %$($k).+, $($field)*} ) ); + (%%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::TRACE, + { %%$($k).+, $($field)*} + ) + ); (?$($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -1564,6 +1638,13 @@ macro_rules! trace { { %$($k).+ } ) ); + (%%$($k:ident).+) => ( + $crate::event!( + target: module_path!(), + $crate::Level::TRACE, + { %%$($k).+ } + ) + ); ($($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -1618,6 +1699,9 @@ macro_rules! debug { (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+) ); @@ -1635,6 +1719,9 @@ macro_rules! debug { (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, {}, $($arg)+) ); @@ -1652,6 +1739,9 @@ macro_rules! debug { (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { %$($k).+ $($field)* }) ); + (target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { %%$($k).+ $($field)* }) + ); (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+) ); @@ -1669,6 +1759,9 @@ macro_rules! debug { (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { %$($k).+ $($field)* }) ); + (name: $name:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { %%$($k).+ $($field)* }) + ); (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+) ); @@ -1686,6 +1779,9 @@ macro_rules! debug { (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, $crate::Level::DEBUG, { %$($k).+ $($field)* }) ); + (name: $name:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, $crate::Level::DEBUG, { %%$($k).+ $($field)* }) + ); (name: $name:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, $crate::Level::DEBUG, {}, $($arg)+) ); @@ -1703,6 +1799,9 @@ macro_rules! debug { (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, $crate::Level::DEBUG, { %$($k).+ $($field)* }) ); + (target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::DEBUG, { %%$($k).+ $($field)* }) + ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::DEBUG, {}, $($arg)+) ); @@ -1741,6 +1840,14 @@ macro_rules! debug { { %$($k).+ = $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::DEBUG, + { %%$($k).+ = $($field)*} + ) + ); (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -1765,6 +1872,14 @@ macro_rules! debug { { %$($k).+, $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::DEBUG, + { %%$($k).+, $($field)*} + ) + ); (parent: $parent:expr, $($arg:tt)+) => ( $crate::event!( target: module_path!(), @@ -1805,6 +1920,13 @@ macro_rules! debug { { %$($k).+ = $($field)*} ) ); + (%%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::DEBUG, + { %%$($k).+ = $($field)*} + ) + ); ($($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -1826,6 +1948,13 @@ macro_rules! debug { { %$($k).+, $($field)*} ) ); + (%%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::DEBUG, + { %%$($k).+, $($field)*} + ) + ); (?$($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -1840,6 +1969,13 @@ macro_rules! debug { { %$($k).+ } ) ); + (%%$($k:ident).+) => ( + $crate::event!( + target: module_path!(), + $crate::Level::DEBUG, + { %%$($k).+ } + ) + ); ($($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -1905,6 +2041,9 @@ macro_rules! info { (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, {}, $($arg)+) ); @@ -1922,6 +2061,9 @@ macro_rules! info { (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, $crate::Level::INFO, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, $crate::Level::INFO, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, $crate::Level::INFO, {}, $($arg)+) ); @@ -1939,6 +2081,9 @@ macro_rules! info { (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { %$($k).+ $($field)* }) ); + (target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { %%$($k).+ $($field)* }) + ); (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, {}, $($arg)+) ); @@ -1956,6 +2101,9 @@ macro_rules! info { (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { %$($k).+ $($field)* }) ); + (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { %%$($k).+ $($field)* }) + ); (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, {}, $($arg)+) ); @@ -1973,6 +2121,9 @@ macro_rules! info { (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, $crate::Level::INFO, { %$($k).+ $($field)* }) ); + (name: $name:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, $crate::Level::INFO, { %%$($k).+ $($field)* }) + ); (name: $name:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, $crate::Level::INFO, {}, $($arg)+) ); @@ -1990,6 +2141,9 @@ macro_rules! info { (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, $crate::Level::INFO, { %$($k).+ $($field)* }) ); + (target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::INFO, { %%$($k).+ $($field)* }) + ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::INFO, {}, $($arg)+) ); @@ -2028,6 +2182,14 @@ macro_rules! info { { %$($k).+ = $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::INFO, + { %%$($k).+ = $($field)*} + ) + ); (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -2052,6 +2214,14 @@ macro_rules! info { { %$($k).+, $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::INFO, + { %%$($k).+, $($field)*} + ) + ); (parent: $parent:expr, $($arg:tt)+) => ( $crate::event!( target: module_path!(), @@ -2092,6 +2262,13 @@ macro_rules! info { { %$($k).+ = $($field)*} ) ); + (%%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::INFO, + { %%$($k).+ = $($field)*} + ) + ); ($($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -2113,6 +2290,13 @@ macro_rules! info { { %$($k).+, $($field)*} ) ); + (%%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::INFO, + { %%$($k).+, $($field)*} + ) + ); (?$($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -2127,6 +2311,13 @@ macro_rules! info { { %$($k).+ } ) ); + (%%$($k:ident).+) => ( + $crate::event!( + target: module_path!(), + $crate::Level::INFO, + { %%$($k).+ } + ) + ); ($($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -2185,6 +2376,9 @@ macro_rules! warn { (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, {}, $($arg)+) ); @@ -2202,6 +2396,9 @@ macro_rules! warn { (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, $crate::Level::WARN, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, $crate::Level::WARN, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, $crate::Level::WARN, {}, $($arg)+) ); @@ -2219,6 +2416,9 @@ macro_rules! warn { (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { %$($k).+ $($field)* }) ); + (target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { %%$($k).+ $($field)* }) + ); (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, {}, $($arg)+) ); @@ -2236,6 +2436,9 @@ macro_rules! warn { (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { %$($k).+ $($field)* }) ); + (name: $name:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { %%$($k).+ $($field)* }) + ); (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, {}, $($arg)+) ); @@ -2253,6 +2456,9 @@ macro_rules! warn { (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, $crate::Level::WARN, { %$($k).+ $($field)* }) ); + (name: $name:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, $crate::Level::WARN, { %%$($k).+ $($field)* }) + ); (name: $name:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, $crate::Level::WARN, {}, $($arg)+) ); @@ -2270,6 +2476,9 @@ macro_rules! warn { (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, $crate::Level::WARN, { %$($k).+ $($field)* }) ); + (target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::WARN, { %%$($k).+ $($field)* }) + ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::WARN, {}, $($arg)+) ); @@ -2308,6 +2517,14 @@ macro_rules! warn { { %$($k).+ = $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::WARN, + { %%$($k).+ = $($field)*} + ) + ); (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -2332,6 +2549,14 @@ macro_rules! warn { { %$($k).+, $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::WARN, + { %%$($k).+, $($field)*} + ) + ); (parent: $parent:expr, $($arg:tt)+) => ( $crate::event!( target: module_path!(), @@ -2372,6 +2597,13 @@ macro_rules! warn { { %$($k).+ = $($field)*} ) ); + (%%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::WARN, + { %%$($k).+ = $($field)*} + ) + ); ($($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -2393,6 +2625,13 @@ macro_rules! warn { { %$($k).+, $($field)*} ) ); + (%%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::WARN, + { %%$($k).+, $($field)*} + ) + ); (?$($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -2407,6 +2646,13 @@ macro_rules! warn { { %$($k).+ } ) ); + (%%$($k:ident).+) => ( + $crate::event!( + target: module_path!(), + $crate::Level::WARN, + { %%$($k).+ } + ) + ); ($($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -2461,6 +2707,9 @@ macro_rules! error { (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, {}, $($arg)+) ); @@ -2478,6 +2727,9 @@ macro_rules! error { (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { %$($k).+ $($field)* }) ); + (name: $name:expr, target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { %%$($k).+ $($field)* }) + ); (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, target: $target, $crate::Level::ERROR, {}, $($arg)+) ); @@ -2495,6 +2747,9 @@ macro_rules! error { (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { %$($k).+ $($field)* }) ); + (target: $target:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { %%$($k).+ $($field)* }) + ); (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, {}, $($arg)+) ); @@ -2512,6 +2767,9 @@ macro_rules! error { (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { %$($k).+ $($field)* }) ); + (name: $name:expr, parent: $parent:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { %%$($k).+ $($field)* }) + ); (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, {}, $($arg)+) ); @@ -2529,6 +2787,9 @@ macro_rules! error { (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(name: $name, $crate::Level::ERROR, { %$($k).+ $($field)* }) ); + (name: $name:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(name: $name, $crate::Level::ERROR, { %%$($k).+ $($field)* }) + ); (name: $name:expr, $($arg:tt)+ ) => ( $crate::event!(name: $name, $crate::Level::ERROR, {}, $($arg)+) ); @@ -2546,6 +2807,9 @@ macro_rules! error { (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( $crate::event!(target: $target, $crate::Level::ERROR, { %$($k).+ $($field)* }) ); + (target: $target:expr, %%$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::ERROR, { %%$($k).+ $($field)* }) + ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::ERROR, {}, $($arg)+) ); @@ -2584,6 +2848,14 @@ macro_rules! error { { %$($k).+ = $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::ERROR, + { %%$($k).+ = $($field)*} + ) + ); (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -2608,6 +2880,14 @@ macro_rules! error { { %$($k).+, $($field)*} ) ); + (parent: $parent:expr, %%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + parent: $parent, + $crate::Level::ERROR, + { %%$($k).+, $($field)*} + ) + ); (parent: $parent:expr, $($arg:tt)+) => ( $crate::event!( target: module_path!(), @@ -2648,6 +2928,13 @@ macro_rules! error { { %$($k).+ = $($field)*} ) ); + (%%$($k:ident).+ = $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::ERROR, + { %%$($k).+ = $($field)*} + ) + ); ($($k:ident).+, $($field:tt)*) => ( $crate::event!( target: module_path!(), @@ -2669,6 +2956,13 @@ macro_rules! error { { %$($k).+, $($field)*} ) ); + (%%$($k:ident).+, $($field:tt)*) => ( + $crate::event!( + target: module_path!(), + $crate::Level::ERROR, + { %%$($k).+, $($field)*} + ) + ); (?$($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -2683,6 +2977,13 @@ macro_rules! error { { %$($k).+ } ) ); + (%%$($k:ident).+) => ( + $crate::event!( + target: module_path!(), + $crate::Level::ERROR, + { %%$($k).+ } + ) + ); ($($k:ident).+) => ( $crate::event!( target: module_path!(), @@ -2842,6 +3143,13 @@ macro_rules! valueset { $($rest)* ) }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %%$val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display_alt(&$val) as &dyn Value)) }, + $next, + $($rest)* + ) + }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => { $crate::valueset!( @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) }, @@ -2870,6 +3178,13 @@ macro_rules! valueset { $($rest)* ) }; + (@ { $(,)* $($out:expr),* }, $next:expr, %%$($k:ident).+, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display_alt(&$($k).+) as &dyn Value)) }, + $next, + $($rest)* + ) + }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr) => { $crate::valueset!( @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$val) as &dyn Value)) }, @@ -2882,6 +3197,12 @@ macro_rules! valueset { $next, ) }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %%$val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display_alt(&$val) as &dyn Value)) }, + $next, + ) + }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr) => { $crate::valueset!( @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) }, @@ -2906,6 +3227,12 @@ macro_rules! valueset { $next, ) }; + (@ { $(,)* $($out:expr),* }, $next:expr, %%$($k:ident).+) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display_alt(&$($k).+) as &dyn Value)) }, + $next, + ) + }; // Handle literal names (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr, $($rest:tt)*) => { @@ -2922,6 +3249,13 @@ macro_rules! valueset { $($rest)* ) }; + (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %%$val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display_alt(&$val) as &dyn Value)) }, + $next, + $($rest)* + ) + }; (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr, $($rest:tt)*) => { $crate::valueset!( @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) }, @@ -2941,6 +3275,12 @@ macro_rules! valueset { $next, ) }; + (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %%$val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display_alt(&$val) as &dyn Value)) }, + $next, + ) + }; (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr) => { $crate::valueset!( @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) }, @@ -2963,6 +3303,13 @@ macro_rules! valueset { $($rest)* ) }; + (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %%$val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, Some(&display_alt(&$val) as &dyn Value)) }, + $next, + $($rest)* + ) + }; (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr, $($rest:tt)*) => { $crate::valueset!( @ { $($out),*, (&$next, Some(&$val as &dyn Value)) }, @@ -2982,6 +3329,12 @@ macro_rules! valueset { $next, ) }; + (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %%$val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, Some(&display_alt(&$val) as &dyn Value)) }, + $next, + ) + }; (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr) => { $crate::valueset!( @ { $($out),*, (&$next, Some(&$val as &dyn Value)) }, @@ -2998,7 +3351,7 @@ macro_rules! valueset { ($fields:expr, $($kvs:tt)+) => { { #[allow(unused_imports)] - use $crate::field::{debug, display, Value}; + use $crate::field::{debug, display, display_alt, Value}; let mut iter = $fields.iter(); $fields.value_set($crate::valueset!( @ { }, @@ -3029,6 +3382,9 @@ macro_rules! fieldset { (@ { $(,)* $($out:expr),* } $($k:ident).+ = %$val:expr, $($rest:tt)*) => { $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) }; + (@ { $(,)* $($out:expr),* } $($k:ident).+ = %%$val:expr, $($rest:tt)*) => { + $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) + }; (@ { $(,)* $($out:expr),* } $($k:ident).+ = $val:expr, $($rest:tt)*) => { $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) }; @@ -3043,6 +3399,9 @@ macro_rules! fieldset { (@ { $(,)* $($out:expr),* } %$($k:ident).+, $($rest:tt)*) => { $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) }; + (@ { $(,)* $($out:expr),* } %%$($k:ident).+, $($rest:tt)*) => { + $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) + }; (@ { $(,)* $($out:expr),* } $($k:ident).+, $($rest:tt)*) => { $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) }; @@ -3054,6 +3413,9 @@ macro_rules! fieldset { (@ { $(,)* $($out:expr),* } $k:literal = %$val:expr, $($rest:tt)*) => { $crate::fieldset!(@ { $($out),*, $k } $($rest)*) }; + (@ { $(,)* $($out:expr),* } $k:literal = %%$val:expr, $($rest:tt)*) => { + $crate::fieldset!(@ { $($out),*, $k } $($rest)*) + }; (@ { $(,)* $($out:expr),* } $k:literal = $val:expr, $($rest:tt)*) => { $crate::fieldset!(@ { $($out),*, $k } $($rest)*) }; @@ -3065,6 +3427,9 @@ macro_rules! fieldset { (@ { $(,)* $($out:expr),* } { $k:expr } = %$val:expr, $($rest:tt)*) => { $crate::fieldset!(@ { $($out),*, $k } $($rest)*) }; + (@ { $(,)* $($out:expr),* } { $k:expr } = %%$val:expr, $($rest:tt)*) => { + $crate::fieldset!(@ { $($out),*, $k } $($rest)*) + }; (@ { $(,)* $($out:expr),* } { $k:expr } = $val:expr, $($rest:tt)*) => { $crate::fieldset!(@ { $($out),*, $k } $($rest)*) }; diff --git a/tracing/tests/event.rs b/tracing/tests/event.rs index d40a7778ae..31d50fc7d2 100644 --- a/tracing/tests/event.rs +++ b/tracing/tests/event.rs @@ -9,7 +9,7 @@ use tracing::{ collect::with_default, debug, error, - field::{debug, display}, + field::{debug, display, display_alt}, info, trace, warn, Level, }; use tracing_mock::*; @@ -291,6 +291,38 @@ fn display_shorthand() { handle.assert_finished(); } +#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] +#[test] +fn display_alt_shorthand() { + struct AlternateString<'a>(&'a str); + + impl std::fmt::Display for AlternateString<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if f.alternate() { + write!(f, "{} with alternate", self.0) + } else { + self.0.fmt(f) + } + } + } + + let (collector, handle) = collector::mock() + .event( + expect::event().with_fields( + expect::field("my_field") + .with_value(&display_alt(AlternateString("hello world"))) + .only(), + ), + ) + .only() + .run_with_handle(); + with_default(collector, || { + tracing::event!(Level::TRACE, my_field = %%AlternateString("hello world")); + }); + + handle.assert_finished(); +} + #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] #[test] fn debug_shorthand() {