diff --git a/tokio-trace/src/lib.rs b/tokio-trace/src/lib.rs index 43de2858c..62c77ab94 100644 --- a/tokio-trace/src/lib.rs +++ b/tokio-trace/src/lib.rs @@ -94,6 +94,40 @@ //! # } //!``` //! +//! The [`field::display`] and [`field::debug`] functions are used to record +//! fields on spans or events using their `fmt::Display` and `fmt::Debug` +//! implementations (rather than as typed data). This may be used in lieu of +//! custom `Value` implementations for complex or user-defined types. +//! +//! In addition, the span and event macros permit the use of the `%` and `?` +//! sigils as shorthand for `field::display` and `field::debug`, respectively. +//! For example: +//! +//! ``` +//! # #[macro_use] +//! # extern crate tokio_trace; +//! # use tokio_trace::Level; +//! # fn main() { +//! #[derive(Debug)] +//! struct MyStruct { +//! my_field: &'static str, +//! } +//! +//! let my_struct = MyStruct { +//! my_field: "Hello world!" +//! }; +//! +//! let my_span = span!( +//! Level::TRACE, +//! "my_span", +//! // `my_struct` will be recorded using its `fmt::Debug` implementation. +//! my_struct = ?my_struct, +//! // `my_field` will be recorded using the implementation of `fmt::Display` for `&str`. +//! my_struct.my_field = %my_struct.my_field, +//! ); +//! # } +//!``` +//! //! ### When to use spans //! //! As a rule of thumb, spans should be used to represent discrete units of work @@ -254,7 +288,8 @@ //! ```rust //! #[macro_use] //! extern crate tokio_trace; -//! use tokio_trace::{field, Level}; +//! use tokio_trace::Level; +//! //! # #[derive(Debug)] pub struct Yak(String); //! # impl Yak { fn shave(&mut self, _: u32) {} } //! # fn find_a_razor() -> Result { Ok(1) } @@ -262,7 +297,7 @@ //! pub fn shave_the_yak(yak: &mut Yak) { //! // Create a new span for this invocation of `shave_the_yak`, annotated //! // with the yak being shaved as a *field* on the span. -//! span!(Level::TRACE, "shave_the_yak", yak = field::debug(&yak)).enter(|| { +//! span!(Level::TRACE, "shave_the_yak", yak = ?yak).enter(|| { //! // Since the span is annotated with the yak, it is part of the context //! // for everything happening inside the span. Therefore, we don't need //! // to add it to the message for this event, as the `log` crate does. @@ -274,7 +309,7 @@ //! // We can add the razor as a field rather than formatting it //! // as part of the message, allowing subscribers to consume it //! // in a more structured manner: -//! info!({ razor = field::display(razor) }, "Razor located"); +//! info!({ razor = %razor }, "Razor located"); //! yak.shave(razor); //! break; //! } @@ -387,6 +422,8 @@ //! [`exit`]: subscriber/trait.Subscriber.html#tymethod.exit //! [`enabled`]: subscriber/trait.Subscriber.html#tymethod.enabled //! [metadata]: struct.Metadata.html +//! [`field::display`]: field/fn.display.html +//! [`field::debug`]: field/fn.debug.html //! [`tokio-trace-nursery`]: https://github.com/tokio-rs/tokio-trace-nursery //! [`tokio-trace-futures`]: https://github.com/tokio-rs/tokio-trace-nursery/tree/master/tokio-trace-futures //! [`tokio-trace-fmt`]: https://github.com/tokio-rs/tokio-trace-nursery/tree/master/tokio-trace-fmt diff --git a/tokio-trace/src/macros.rs b/tokio-trace/src/macros.rs index 3f5018f95..7a44038b2 100644 --- a/tokio-trace/src/macros.rs +++ b/tokio-trace/src/macros.rs @@ -69,6 +69,45 @@ /// # } /// ``` /// +/// Shorthand for `field::debug`: +/// ``` +/// # #[macro_use] +/// # extern crate tokio_trace; +/// # use tokio_trace::Level; +/// # fn main() { +/// #[derive(Debug)] +/// struct MyStruct { +/// field: &'static str, +/// } +/// +/// let my_struct = MyStruct { +/// field: "Hello world!" +/// }; +/// +/// // `my_struct` will be recorded using its `fmt::Debug` implementation. +/// let my_span = span!(Level::TRACE, "my span", my_struct = ?my_struct); +/// # } +/// ``` +/// +/// Shorthand for `field::display`: +/// ``` +/// # #[macro_use] +/// # extern crate tokio_trace; +/// # use tokio_trace::Level; +/// # fn main() { +/// # #[derive(Debug)] +/// # struct MyStruct { +/// # field: &'static str, +/// # } +/// # +/// # let my_struct = MyStruct { +/// # field: "Hello world!" +/// # }; +/// // `my_struct.field` will be recorded using its `fmt::Display` implementation. +/// let my_span = span!(Level::TRACE, "my span", my_struct.field = %my_struct.field); +/// # } +/// ``` +/// /// Note that a span may have up to 32 fields. The following will not compile: /// ```rust,compile_fail /// # #[macro_use] @@ -87,16 +126,10 @@ /// ``` #[macro_export(local_inner_macros)] macro_rules! span { - ($lvl:expr, target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr )* ),*,) => { - span!( - $lvl, - target: $target, - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) + ($lvl:expr, target: $target:expr, parent: $parent:expr, $name:expr) => { + span!($lvl, target: $target, parent: $parent, $name,) }; - ($lvl:expr, target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr )* ),*) => { + ($lvl:expr, target: $target:expr, parent: $parent:expr, $name:expr, $($fields:tt)*) => { { use $crate::callsite; use $crate::callsite::Callsite; @@ -105,7 +138,7 @@ macro_rules! span { kind: $crate::metadata::Kind::SPAN, target: $target, level: $lvl, - fields: $($($k).+),* + fields: $($fields)* }; let meta = callsite.metadata(); @@ -113,17 +146,17 @@ macro_rules! span { $crate::Span::child_of( $parent, meta, - &valueset!(meta.fields(), $($($k).+ $( = $val)*),*), + &valueset!(meta.fields(), $($fields)*), ) } else { __tokio_trace_disabled_span!( meta, - &valueset!(meta.fields(), $($($k).+ $( = $val)*),*) + &valueset!(meta.fields(), $($fields)*) ) } } }; - ($lvl:expr, target: $target:expr, $name:expr,$($($k:ident).+ $( = $val:expr )* ),*) => { + ($lvl:expr, target: $target:expr, $name:expr, $($fields:tt)*) => { { use $crate::callsite; use $crate::callsite::Callsite; @@ -132,19 +165,19 @@ macro_rules! span { kind: $crate::metadata::Kind::SPAN, target: $target, level: $lvl, - fields: $( $($k).+ ),* + fields: $($fields)* }; let meta = callsite.metadata(); if $lvl <= $crate::level_filters::STATIC_MAX_LEVEL && is_enabled!(callsite) { $crate::Span::new( meta, - &valueset!(meta.fields(), $($($k).+ $( = $val)*),*), + &valueset!(meta.fields(), $($fields)*) ) } else { __tokio_trace_disabled_span!( meta, - &valueset!(meta.fields(), $($($k).+ $( = $val)*),*) + &valueset!(meta.fields(), $($fields)*) ) } } @@ -153,22 +186,13 @@ macro_rules! span { ($lvl:expr, target: $target:expr, parent: $parent:expr, $name:expr) => { span!($lvl, target: $target, parent: $parent, $name,) }; - ($lvl:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { + ($lvl:expr, parent: $parent:expr, $name:expr, $($fields:tt)*) => { span!( $lvl, target: __tokio_trace_module_path!(), parent: $parent, $name, - $($($k).+ $( = $val)*),* - ) - }; - ($lvl:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { - span!( - $lvl, - target: __tokio_trace_module_path!(), - parent: $parent, - $name, - $($($k).+ $( = $val)*),* + $($fields)* ) }; ($lvl:expr, parent: $parent:expr, $name:expr) => { @@ -179,40 +203,23 @@ macro_rules! span { $name, ) }; - ($lvl:expr, target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr )* ),*, - ) => { + ($lvl:expr, target: $target:expr, $name:expr, $($fields:tt)*) => { span!( $lvl, target: $target, $name, - $($($k).+ $( = $val)*),* - ) - }; - ($lvl:expr, target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr )* ),*) => { - span!( - $lvl, - target: $target, - $name, - $($($k).+ $( = $val)*),* + $($fields)* ) }; ($lvl:expr, target: $target:expr, $name:expr) => { span!($lvl, target: $target, $name,) }; - ($lvl:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { + ($lvl:expr, $name:expr, $($fields:tt)*) => { span!( $lvl, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* - ) - }; - ($lvl:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { - span!( - $lvl, - target: __tokio_trace_module_path!(), - $name, - $($($k).+ $( = $val)*),* + $($fields)* ) }; ($lvl:expr, $name:expr) => { @@ -240,74 +247,46 @@ macro_rules! span { /// ``` #[macro_export(local_inner_macros)] macro_rules! trace_span { - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - trace_span!( - target: $target, - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::TRACE, target: $target, parent: $parent, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, parent: $parent:expr, $name:expr) => { trace_span!(target: $target, parent: $parent, $name,) }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - trace_span!( - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::TRACE, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (parent: $parent:expr, $name:expr) => { trace_span!(parent: $parent, $name,) }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - trace_span!( - target: $target, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::TRACE, target: $target, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, $name:expr) => { trace_span!(target: $target, $name,) }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - trace_span!( - $name, - $($($k).+ $( = $val)*),* - ) - }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + ($name:expr, $($field:tt)*) => { span!( $crate::Level::TRACE, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; ($name:expr) => {trace_span!($name,)}; @@ -329,74 +308,46 @@ macro_rules! trace_span { /// ``` #[macro_export(local_inner_macros)] macro_rules! debug_span { - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - debug_span!( - target: $target, - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::DEBUG, target: $target, parent: $parent, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, parent: $parent:expr, $name:expr) => { debug_span!(target: $target, parent: $parent, $name,) }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - debug_span!( - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::DEBUG, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (parent: $parent:expr, $name:expr) => { debug_span!(parent: $parent, $name,) }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - debug_span!( - target: $target, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::DEBUG, target: $target, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, $name:expr) => { debug_span!(target: $target, $name,) }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - debug_span!( - $name, - $($($k).+ $( = $val)*),* - ) - }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + ($name:expr, $($field:tt)*) => { span!( $crate::Level::DEBUG, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; ($name:expr) => {debug_span!($name,)}; @@ -418,74 +369,46 @@ macro_rules! debug_span { /// ``` #[macro_export(local_inner_macros)] macro_rules! info_span { - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - info_span!( - target: $target, - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::INFO, target: $target, parent: $parent, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, parent: $parent:expr, $name:expr) => { info_span!(target: $target, parent: $parent, $name,) }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - info_span!( - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::INFO, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (parent: $parent:expr, $name:expr) => { info_span!(parent: $parent, $name,) }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - info_span!( - target: $target, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::INFO, target: $target, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, $name:expr) => { info_span!(target: $target, $name,) }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - info_span!( - $name, - $($($k).+ $( = $val)*),* - ) - }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + ($name:expr, $($field:tt)*) => { span!( $crate::Level::INFO, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; ($name:expr) => {info_span!($name,)}; @@ -507,74 +430,46 @@ macro_rules! info_span { /// ``` #[macro_export(local_inner_macros)] macro_rules! warn_span { - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - warn_span!( - target: $target, - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::WARN, target: $target, parent: $parent, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, parent: $parent:expr, $name:expr) => { warn_span!(target: $target, parent: $parent, $name,) }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - warn_span!( - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::WARN, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (parent: $parent:expr, $name:expr) => { warn_span!(parent: $parent, $name,) }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - warn_span!( - target: $target, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::WARN, target: $target, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, $name:expr) => { warn_span!(target: $target, $name,) }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - warn_span!( - $name, - $($($k).+ $( = $val)*),* - ) - }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + ($name:expr, $($field:tt)*) => { span!( $crate::Level::WARN, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; ($name:expr) => {warn_span!($name,)}; @@ -595,74 +490,46 @@ macro_rules! warn_span { /// ``` #[macro_export(local_inner_macros)] macro_rules! error_span { - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - error_span!( - target: $target, - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::ERROR, target: $target, parent: $parent, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, parent: $parent:expr, $name:expr) => { error_span!(target: $target, parent: $parent, $name,) }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - error_span!( - parent: $parent, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (parent: $parent:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (parent: $parent:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::ERROR, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (parent: $parent:expr, $name:expr) => { error_span!(parent: $parent, $name,) }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - error_span!( - target: $target, - $name, - $($($k).+ $( = $val)*),* - ) - }; - (target: $target:expr, $name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + (target: $target:expr, $name:expr, $($field:tt)*) => { span!( $crate::Level::ERROR, target: $target, $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; (target: $target:expr, $name:expr) => { error_span!(target: $target, $name,) }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*,) => { - error_span!( - $name, - $($($k).+ $( = $val)*),* - ) - }; - ($name:expr, $($($k:ident).+ $( = $val:expr)*),*) => { + ($name:expr, $($field:tt)*) => { span!( $crate::Level::ERROR, target: __tokio_trace_module_path!(), $name, - $($($k).+ $( = $val)*),* + $($field)* ) }; ($name:expr) => {error_span!($name,)}; @@ -708,7 +575,43 @@ macro_rules! error_span { /// event!(Level::Info, foo = 5, bad_field, bar = field::display("hello")) /// #} /// ``` +/// Shorthand for `field::debug`: +/// ``` +/// # #[macro_use] +/// # extern crate tokio_trace; +/// # use tokio_trace::Level; +/// # fn main() { +/// #[derive(Debug)] +/// struct MyStruct { +/// field: &'static str, +/// } /// +/// let my_struct = MyStruct { +/// field: "Hello world!" +/// }; +/// +/// // `my_struct` will be recorded using its `fmt::Debug` implementation. +/// event!(Level::TRACE, my_struct = ?my_struct); +/// # } +/// ``` +/// Shorthand for `field::display`: +/// ``` +/// # #[macro_use] +/// # extern crate tokio_trace; +/// # use tokio_trace::Level; +/// # fn main() { +/// # #[derive(Debug)] +/// # struct MyStruct { +/// # field: &'static str, +/// # } +/// # +/// # let my_struct = MyStruct { +/// # field: "Hello world!" +/// # }; +/// // `my_struct.field` will be recorded using its `fmt::Display` implementation. +/// event!(Level::TRACE, my_struct.field = %my_struct.field); +/// # } +/// ``` /// Events may have up to 32 fields. The following will not compile: /// ```rust,compile_fail /// # #[macro_use] @@ -725,12 +628,12 @@ macro_rules! error_span { /// ``` #[macro_export(local_inner_macros)] macro_rules! event { - (target: $target:expr, $lvl:expr, { $( $($k:ident).+ = $val:expr ),* $(,)*} )=> ({ + (target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({ { __tokio_trace_log!( target: $target, $lvl, - $( $($k).+ = $val ),* + $($fields)* ); if $lvl <= $crate::level_filters::STATIC_MAX_LEVEL { @@ -747,67 +650,48 @@ macro_rules! event { kind: $crate::metadata::Kind::EVENT, target: $target, level: $lvl, - fields: $( $($k).+ ),* + fields: $($fields)* }; if is_enabled!(callsite) { let meta = callsite.metadata(); - Event::dispatch(meta, &valueset!(meta.fields(), $( $($k).+ = $val),* )); + Event::dispatch(meta, &valueset!(meta.fields(), $($fields)*) ); } } } }); - ( - target: $target:expr, - $lvl:expr, - { $( $($k:ident).+ = $val:expr ),*, }, - $($arg:tt)+ - ) => ({ + (target: $target:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => ({ event!( target: $target, $lvl, - { message = __tokio_trace_format_args!($($arg)+), $( $($k).+ = $val ),* } + { message = __tokio_trace_format_args!($($arg)+), $($fields)* } ) }); - ( - target: $target:expr, - $lvl:expr, - { $( $($k:ident).+ = $val:expr ),* }, - $($arg:tt)+ - ) => ({ - event!( - target: $target, - $lvl, - { message = __tokio_trace_format_args!($($arg)+), $( $($k).+ = $val ),* } - ) - }); - (target: $target:expr, $lvl:expr, $( $($k:ident).+ = $val:expr ),+, ) => ( - event!(target: $target, $lvl, { $($($k).+ = $val),+ }) - ); - (target: $target:expr, $lvl:expr, $( $($k:ident).+ = $val:expr ),+ ) => ( - event!(target: $target, $lvl, { $($($k).+ = $val),+ }) + (target: $target:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => ( + event!(target: $target, $lvl, { $($k).+ = $($fields)* }) ); (target: $target:expr, $lvl:expr, $($arg:tt)+ ) => ( event!(target: $target, $lvl, { }, $($arg)+) ); - ( $lvl:expr, { $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( + ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => ( event!( target: __tokio_trace_module_path!(), $lvl, - { message = __tokio_trace_format_args!($($arg)+), $($($k).+ = $val),* } + { message = __tokio_trace_format_args!($($arg)+), $($fields)* } ) ); - ( $lvl:expr, { $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( + ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => ( event!( target: __tokio_trace_module_path!(), $lvl, - { message = __tokio_trace_format_args!($($arg)+), $($($k).+ = $val),* } + { message = __tokio_trace_format_args!($($arg)+), $($fields)* } ) ); - ( $lvl:expr, $( $($k:ident).+ = $val:expr ),*, ) => ( - event!(target: __tokio_trace_module_path!(), $lvl, { $($($k).+ = $val),* }) - ); - ( $lvl:expr, $( $($k:ident).+ = $val:expr ),* ) => ( - event!(target: __tokio_trace_module_path!(), $lvl, { $($($k).+ = $val),* }) + ( $lvl:expr, $($k:ident).+ = $($fields:tt)+) => ( + event!( + target: __tokio_trace_module_path!(), + $lvl, + { $($k).+ = $($fields)+ } + ) ); ( $lvl:expr, $($arg:tt)+ ) => ( event!(target: __tokio_trace_module_path!(), $lvl, { }, $($arg)+) @@ -850,52 +734,31 @@ macro_rules! event { /// ``` #[macro_export(local_inner_macros)] macro_rules! trace { - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::TRACE, { $($($k).+ = $val),* }, $($arg)+) + (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( + event!(target: $target, $crate::Level::TRACE, { $($field)* }, $($arg)*) ); - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::TRACE, { $($($k).+ = $val),* }, $($arg)+) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),*, ) => ( - event!(target: $target, $crate::Level::TRACE, { $($($k).+ = $val),* }) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),* ) => ( - event!(target: $target, $crate::Level::TRACE, { $($($k).+ = $val),* }) + (target: $target:expr, $($k:ident).+ = $($field:tt)+ ) => ( + event!(target: $target, $crate::Level::TRACE, { $($k).+ = $($field)+ }) ); (target: $target:expr, $($arg:tt)+ ) => ( - drop(event!(target: $target, $crate::Level::TRACE, {}, $($arg)+)); + event!(target: $target, $crate::Level::TRACE, {}, $($arg)+) ); - ({ $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( + ({ $($k:ident).+ = $($field:tt)+ }, $($arg:tt)+ ) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::TRACE, - { $($($k).+ = $val),* }, + { $($k).+ = $($field)+ }, $($arg)+ ) ); - ({ $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( + ($($k:ident).+ = $($field:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::TRACE, - { $($($k).+ = $val),* }, - $($arg)+ + { $($k).+ = $($field)+} ) ); - ($( $($k:ident).+ = $val:expr ),*, ) => ( - event!( - target: __tokio_trace_module_path!(), - $crate::Level::TRACE, - { $($($k).+ = $val),* } - ) - ); - ($( $($k:ident).+ = $val:expr ),* ) => ( - event!( - target: __tokio_trace_module_path!(), - $crate::Level::TRACE, - { $($($k).+ = $val),* } - ) - ); - ($($arg:tt)+ ) => ( + ($($arg:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::TRACE, @@ -928,48 +791,31 @@ macro_rules! trace { /// ``` #[macro_export(local_inner_macros)] macro_rules! debug { - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::DEBUG, { $($($k).+ = $val),* }, $($arg)+) + (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( + event!(target: $target, $crate::Level::DEBUG, { $($field)* }, $($arg)*) ); - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::DEBUG, { $($($k).+ = $val),* }, $($arg)+) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),*, ) => ( - event!(target: $target, $crate::Level::DEBUG, { $($($k).+ = $val),* }) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),* ) => ( - event!(target: $target, $crate::Level::DEBUG, { $($($k).+ = $val),* }) + (target: $target:expr, $($k:ident).+ = $($field:tt)+ ) => ( + event!(target: $target, $crate::Level::DEBUG, { $($k).+ = $($field)+ }) ); (target: $target:expr, $($arg:tt)+ ) => ( event!(target: $target, $crate::Level::DEBUG, {}, $($arg)+) ); - ({ $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( - event!( - target: __tokio_trace_module_path!(), $crate::Level::DEBUG, { $($($k).+ = $val),* }, $($arg)+) - ); - ({ $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( + ({ $($k:ident).+ = $($field:tt)+ }, $($arg:tt)+ ) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::DEBUG, - { $($($k).+ = $val),* }, + { $($k).+ = $($field)+ }, $($arg)+ ) ); - ($( $($k:ident).+ = $val:expr ),*, ) => ( + ($($k:ident).+ = $($field:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::DEBUG, - { $($($k).+ = $val),* } + { $($k).+ = $($field)+} ) ); - ($( $($k:ident).+ = $val:expr ),* ) => ( - event!( - target: __tokio_trace_module_path!(), - $crate::Level::DEBUG, - { $($($k).+ = $val),* } - ) - ); - ($($arg:tt)+ ) => ( + ($($arg:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::DEBUG, @@ -1009,52 +855,31 @@ macro_rules! debug { /// ``` #[macro_export(local_inner_macros)] macro_rules! info { - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::INFO, { $($($k).+ = $val),* }, $($arg)+) + (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( + event!(target: $target, $crate::Level::INFO, { $($field)* }, $($arg)*) ); - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::INFO, { $($($k).+ = $val),* }, $($arg)+) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),*, ) => ( - event!(target: $target, $crate::Level::INFO, { $($($k).+ = $val),* }) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),* ) => ( - event!(target: $target, $crate::Level::INFO, { $($($k).+ = $val),* }) + (target: $target:expr, $($k:ident).+ = $($field:tt)+ ) => ( + event!(target: $target, $crate::Level::INFO, { $($k).+ = $($field)+ }) ); (target: $target:expr, $($arg:tt)+ ) => ( event!(target: $target, $crate::Level::INFO, {}, $($arg)+) ); - ({ $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( + ({ $($k:ident).+ = $($field:tt)+ }, $($arg:tt)+ ) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::INFO, - { $($($k).+ = $val),* }, + { $($k).+ = $($field)+ }, $($arg)+ ) ); - ({ $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( + ($($k:ident).+ = $($field:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::INFO, - { $($($k).+ = $val),* }, - $($arg)+ + { $($k).+ = $($field)+} ) ); - ($( $($k:ident).+ = $val:expr ),*, ) => ( - event!( - target: __tokio_trace_module_path!(), - $crate::Level::INFO, - { $($($k).+ = $val),* } - ) - ); - ($( $($k:ident).+ = $val:expr ),* ) => ( - event!( - target: __tokio_trace_module_path!(), - $crate::Level::INFO, - { $($($k).+ = $val),* } - ) - ); - ($($arg:tt)+ ) => ( + ($($arg:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::INFO, @@ -1091,51 +916,31 @@ macro_rules! info { /// ``` #[macro_export(local_inner_macros)] macro_rules! warn { - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::WARN, { $($($k).+ = $val),* }, $($arg)+) + (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( + event!(target: $target, $crate::Level::WARN, { $($field)* }, $($arg)*) ); - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::WARN, { $($($k).+ = $val),* }, $($arg)+) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),*, ) => ( - event!(target: $target, $crate::Level::WARN, { $($($k).+ = $val),* }) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),* ) => ( - event!(target: $target, $crate::Level::WARN, { $($($k).+ = $val),* }) + (target: $target:expr, $($k:ident).+ = $($field:tt)+ ) => ( + event!(target: $target, $crate::Level::WARN, { $($k).+ = $($field)+ }) ); (target: $target:expr, $($arg:tt)+ ) => ( - drop(event!(target: $target, $crate::Level::WARN, {}, $($arg)+)); + event!(target: $target, $crate::Level::WARN, {}, $($arg)+) ); - ({ $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( + ({ $($k:ident).+ = $($field:tt)+ }, $($arg:tt)+ ) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::WARN, - { $($($k).+ = $val),* }, + { $($k).+ = $($field)+ }, $($arg)+ ) ); - ({ $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( + ($($k:ident).+ = $($field:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::WARN, - { $($($k).+ = $val),* }, - $($arg)+ + { $($k).+ = $($field)+} ) ); - ($( $($k:ident).+ = $val:expr ),*, ) => ( - event!( - target: __tokio_trace_module_path!(), - $crate::Level::WARN,{ $($($k).+ = $val),* } - ) - ); - ($( $($k:ident).+ = $val:expr ),* ) => ( - event!( - target: __tokio_trace_module_path!(), - $crate::Level::WARN, - { $($($k).+ = $val),* } - ) - ); - ($($arg:tt)+ ) => ( + ($($arg:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::WARN, @@ -1167,52 +972,31 @@ macro_rules! warn { /// ``` #[macro_export(local_inner_macros)] macro_rules! error { - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::ERROR, { $($($k).+ = $val),* }, $($arg)+) + (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( + event!(target: $target, $crate::Level::ERROR, { $($field)* }, $($arg)*) ); - (target: $target:expr, { $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( - event!(target: $target, $crate::Level::ERROR, { $($($k).+ = $val),* }, $($arg)+) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),*, ) => ( - event!(target: $target, $crate::Level::ERROR, { $($($k).+ = $val),* }) - ); - (target: $target:expr, $( $($k:ident).+ = $val:expr ),* ) => ( - event!(target: $target, $crate::Level::ERROR, { $($($k).+ = $val),* }) + (target: $target:expr, $($k:ident).+ = $($field:tt)+ ) => ( + event!(target: $target, $crate::Level::ERROR, { $($k).+ = $($field)+ }) ); (target: $target:expr, $($arg:tt)+ ) => ( event!(target: $target, $crate::Level::ERROR, {}, $($arg)+) ); - ({ $( $($k:ident).+ = $val:expr ),*, }, $($arg:tt)+ ) => ( + ({ $($k:ident).+ = $($field:tt)+ }, $($arg:tt)+ ) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::ERROR, - { $($($k).+ = $val),* }, + { $($k).+ = $($field)+ }, $($arg)+ ) ); - ({ $( $($k:ident).+ = $val:expr ),* }, $($arg:tt)+ ) => ( + ($($k:ident).+ = $($field:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::ERROR, - { $($($k).+ = $val),* }, - $($arg)+ + { $($k).+ = $($field)+} ) ); - ($( $($k:ident).+ = $val:expr ),*, ) => ( - event!( - target: __tokio_trace_module_path!(), - $crate::Level::ERROR, - { $($($k).+ = $val),* } - ) - ); - ($( $($k:ident).+ = $val:expr ),* ) => ( - event!( - target: __tokio_trace_module_path!(), - $crate::Level::ERROR, - { $($($k).+ = $val),* } - ) - ); - ($($arg:tt)+ ) => ( + ($($arg:tt)+) => ( event!( target: __tokio_trace_module_path!(), $crate::Level::ERROR, @@ -1226,46 +1010,48 @@ macro_rules! error { #[doc(hidden)] #[macro_export(local_inner_macros)] macro_rules! callsite { - (name: $name:expr, kind: $kind:expr, fields: $( $field_name:expr ),* $(,)*) => ({ + (name: $name:expr, kind: $kind:expr, fields: $($fields:tt)*) => {{ callsite! { name: $name, kind: $kind, target: __tokio_trace_module_path!(), level: $crate::Level::TRACE, - fields: $( $field_name ),* + fields: $($fields)* } - }); + }}; ( name: $name:expr, kind: $kind:expr, level: $lvl:expr, - fields: $( $field_name:expr ),* $(,)* - ) => ({ + fields: $($fields:tt)* + ) => {{ callsite! { name: $name, kind: $kind, target: __tokio_trace_module_path!(), level: $lvl, - fields: $( $field_name ),* + fields: $($fields)* } - }); + }}; ( name: $name:expr, kind: $kind:expr, target: $target:expr, level: $lvl:expr, - fields: $( $field_name:expr ),* - $(,)* - ) => ({ - use std::sync::{Once, atomic::{self, AtomicUsize, Ordering}}; - use $crate::{callsite, Metadata, subscriber::Interest}; + fields: $($fields:tt)* + ) => {{ + use std::sync::{ + atomic::{self, AtomicUsize, Ordering}, + Once, + }; + use $crate::{callsite, subscriber::Interest, Metadata}; struct MyCallsite; static META: Metadata<'static> = { metadata! { name: $name, target: $target, level: $lvl, - fields: &[ $( __tokio_trace_stringify!($field_name) ),* ], + fields: fieldset!( $($fields)* ), callsite: &MyCallsite, kind: $kind, } @@ -1288,7 +1074,7 @@ macro_rules! callsite { impl callsite::Callsite for MyCallsite { fn set_interest(&self, interest: Interest) { let interest = match () { - _ if interest.is_never() => 0, + _ if interest.is_never() => 0, _ if interest.is_always() => 2, _ => 1, }; @@ -1303,7 +1089,7 @@ macro_rules! callsite { callsite::register(&MyCallsite); }); &MyCallsite - }) + }}; } #[macro_export] @@ -1326,21 +1112,113 @@ macro_rules! is_enabled { #[doc(hidden)] #[macro_export(local_inner_macros)] macro_rules! valueset { - ($fields:expr, $($($k:ident).+ $( = $val:expr )* ) ,*) => { + + // === base case === + (@ { $($val:expr),* }, $next:expr, $(,)*) => { + &[ $($val),* ] + }; + + // === recursive case (more tts), non-empty out set === + (@ { $($out:expr),+ }, $next:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { + valueset!( + @ { $($out),+, (&$next, Some(&debug(&$val) as &Value)) }, + $next, + $($rest)* + ) + }; + (@ { $($out:expr),+ }, $next:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + valueset!( + @ { $($out),+, (&$next, Some(&display(&$val) as &Value)) }, + $next, + $($rest)* + ) + }; + (@ { $($out:expr),+ }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => { + valueset!( + @ { $($out),+, (&$next, Some(&$val as &Value)) }, + $next, + $($rest)* + ) + }; + (@{ $($out:expr),+ }, $next:expr, $($k:ident).+, $($rest:tt)*) => { + valueset!(@ { $($out),+, (&$next, None) }, $next, $($rest)*) + }; + + // == recursive case (more tts), empty out set === + (@ { }, $next:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)* ) => { + valueset!(@ { (&$next, Some(&debug(&$val) as &Value)) }, $next, $($rest)* ) + }; + (@ { }, $next:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + valueset!(@ { (&$next, Some(&display(&$val) as &Value)) }, $next, $($rest)*) + }; + (@ { }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => { + valueset!(@ { (&$next, Some(&$val as &Value)) }, $next, $($rest)*) + }; + (@ { }, $next:expr, $($k:ident).+, $($rest:tt)*) => { + valueset!(@ { (&$next, None) }, $next, $($rest)* ) + }; + + // === entry === + ($fields:expr, $($kvs:tt)+) => { { + #[allow(unused_imports)] + use $crate::field::{debug, display, Value}; let mut iter = $fields.iter(); - $fields.value_set(&[ - $(( - &iter.next().expect("FieldSet corrupted (this is a bug)"), - valueset!(@val $($k).+ $(= $val)*) - )),* - ]) + $fields.value_set(valueset!( + @ { }, + iter.next().expect("FieldSet corrupted (this is a bug)"), + $($kvs)+, + )) } }; - (@val $($k:ident).+ = $val:expr) => { - Some(&$val as &$crate::field::Value) + ($fields:expr,) => { + { + $fields.value_set(&[]) + } }; - (@val $($k:ident).+) => { None }; +} + +#[doc(hidden)] +#[macro_export(local_inner_macros)] +macro_rules! fieldset { + // == base case == + (@ { $($out:expr),* $(,)* } $(,)*) => { + &[ $($out),* ] + }; + + // == empty out set, remaining tts == + (@ { } $($k:ident).+ = ?$_val:expr, $($rest:tt)*) => { + fieldset!(@ { __tokio_trace_stringify!($($k).+) } $($rest)*) + }; + (@ { } $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + fieldset!(@ { __tokio_trace_stringify!($($k).+) } $($rest)*) + }; + (@ { } $($k:ident).+ = $val:expr, $($rest:tt)*) => { + fieldset!(@ { __tokio_trace_stringify!($($k).+) } $($rest)*) + }; + (@ { } $($k:ident).+, $($rest:tt)*) => { + fieldset!(@ { __tokio_trace_stringify!($($k).+) } $($rest)*) + }; + + // == non-empty out set, remaining tts == + (@ { $($out:expr),+ } $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { + fieldset!(@ { $($out),+,__tokio_trace_stringify!($($k).+) } $($rest)*) + }; + (@ { $($out:expr),+ } $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + fieldset!(@ { $($out),+, __tokio_trace_stringify!($($k).+) } $($rest)*) + }; + (@ { $($out:expr),+ } $($k:ident).+ = $val:expr, $($rest:tt)*) => { + fieldset!(@ { $($out),+, __tokio_trace_stringify!($($k).+) } $($rest)*) + }; + (@ { $($out:expr),+ } $($k:ident).+, $($rest:tt)*) => { + fieldset!(@ { $($out),+, __tokio_trace_stringify!($($k).+) } $($rest)*) + }; + + // == entry == + ($($args:tt)*) => { + fieldset!(@ { } $($args)*, ) + }; + } // The macros above cannot invoke format_args directly because they use @@ -1420,7 +1298,7 @@ macro_rules! level_to_log { #[doc(hidden)] #[macro_export(local_inner_macros)] macro_rules! __tokio_trace_log { - (target: $target:expr, $level:expr, $( $($k:ident).+ $( = $val:expr )* ),* $(,)* ) => { + (target: $target:expr, $level:expr, $($field:tt)+ ) => { use $crate::log; let level = level_to_log!($level); if level <= log::STATIC_MAX_LEVEL { @@ -1435,29 +1313,18 @@ macro_rules! __tokio_trace_log { .module_path(Some(__tokio_trace_module_path!())) .line(Some(__tokio_trace_line!())) .metadata(log_meta) - .args(__tokio_trace_format_args!( - __tokio_trace_concat!( - $(__tokio_trace_log!(@key $($k).+)),* - ), - $( - __tokio_trace_log!(@val_or $($k).+ $( = $val)* ) - ),* - )) + .args(__mk_format_args!($($field)+)) .build()); } } }; - (@key message) => { "{} " }; - (@key $($k:ident).+) => { __tokio_trace_concat!(__tokio_trace_stringify!( $($k).+ ), "={:?} ") }; - (@val_or $($k:ident).+ = $v:expr) => { $v }; - (@val_or $($k:ident).+ ) => { __tokio_trace_format_args!("?") }; } #[cfg(not(feature = "log"))] #[doc(hidden)] #[macro_export] macro_rules! __tokio_trace_log { - (target: $target:expr, $level:expr, $( $($k:ident).+ $( = $val:expr )* ),* $(,)* ) => {}; + (target: $target:expr, $level:expr, $($field:tt)+ ) => {}; } #[cfg(feature = "log")] @@ -1479,3 +1346,89 @@ macro_rules! __tokio_trace_disabled_span { $crate::Span::new_disabled($meta) }; } + +#[cfg(feature = "log")] +#[doc(hidden)] +#[macro_export(local_inner_macros)] +macro_rules! __mk_format_string { + // === base case === + (@ { $($out:expr),+ } $(,)*) => { + __tokio_trace_concat!( $($out),+) + }; + + // === recursive case (more tts), non-empty out set === + (@ { $($out:expr),+ }, message = $val:expr, $($rest:tt)*) => { + __mk_format_string!(@ { $($out),+, "{} " }, $($rest)*) + }; + (@ { $($out:expr),+ }, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { + __mk_format_string!(@ { $($out),+, __tokio_trace_stringify!($($k).+), "={:?} " }, $($rest)*) + }; + (@ { $($out:expr),+ }, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + __mk_format_string!(@ { $($out),+, __tokio_trace_stringify!($($k).+), "={} " }, $($rest)*) + }; + (@ { $($out:expr),+ }, $($k:ident).+ = $val:expr, $($rest:tt)*) => { + __mk_format_string!(@ { $($out),+, __tokio_trace_stringify!($($k).+), "={:?} " }, $($rest)*) + }; + + // === recursive case (more tts), empty out set === + (@ { }, message = $val:expr, $($rest:tt)*) => { + __mk_format_string!(@ { "{} " }, $($rest)*) + }; + (@ { }, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { + __mk_format_string!(@ { __tokio_trace_stringify!($($k).+), "={:?} " }, $($rest)*) + }; + (@ { }, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + __mk_format_string!(@ { __tokio_trace_stringify!($($k).+), "={} " }, $($rest)*) + }; + (@ { }, $($k:ident).+ = $val:expr, $($rest:tt)*) => { + __mk_format_string!(@ { __tokio_trace_stringify!($($k).+), "={:?} " }, $($rest)*) + }; + + // === entry === + ($($kvs:tt)+) => { + __mk_format_string!(@ { }, $($kvs)+,) + }; + () => { + "" + } +} + +#[cfg(feature = "log")] +#[doc(hidden)] +#[macro_export(local_inner_macros)] +macro_rules! __mk_format_args { + // == base case == + (@ { $($out:expr),* }, $fmt:expr, $(,)*) => { + __tokio_trace_format_args!($fmt, $($out),*) + }; + + // === recursive case (more tts), non-empty out set === + (@ { $($out:expr),+ }, $fmt:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { + __mk_format_args!(@ { $($out),+, $val }, $fmt, $($rest)*) + }; + (@ { $($out:expr),+ }, $fmt:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + __mk_format_args!(@ { $($out),+, $val }, $fmt, $($rest)*) + }; + (@ { $($out:expr),+ }, $fmt:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => { + __mk_format_args!(@ { $($out),+, $val }, $fmt, $($rest)*) + }; + + // == recursive case (more tts), empty out set === + (@ { }, $fmt:expr, message = $val:expr, $($rest:tt)*) => { + __mk_format_args!(@ { $val }, $fmt, $($rest)*) + }; + (@ { }, $fmt:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { + __mk_format_args!(@ { $val }, $fmt, $($rest)*) + }; + (@ { }, $fmt:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + __mk_format_args!(@ { $val }, $fmt, $($rest)*) + }; + (@ { }, $fmt:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => { + __mk_format_args!(@ { $val }, $fmt, $($rest)*) + }; + + // === entry === + ($($kv:tt)*) => { + __mk_format_args!(@ { }, __mk_format_string!($($kv)*), $($kv)*,) + }; +} diff --git a/tokio-trace/tests/event.rs b/tokio-trace/tests/event.rs index e6cf24d6f..424fb3c13 100644 --- a/tokio-trace/tests/event.rs +++ b/tokio-trace/tests/event.rs @@ -4,7 +4,11 @@ mod support; use self::support::*; -use tokio_trace::{field::display, subscriber::with_default, Level}; +use tokio_trace::{ + field::{debug, display}, + subscriber::with_default, + Level, +}; #[test] fn event_without_message() { @@ -187,3 +191,61 @@ fn move_field_out_of_struct() { }); handle.assert_finished(); } + +#[test] +fn display_shorthand() { + let (subscriber, handle) = subscriber::mock() + .event( + event::mock().with_fields( + field::mock("my_field") + .with_value(&display("hello world")) + .only(), + ), + ) + .done() + .run_with_handle(); + with_default(subscriber, || { + event!(Level::TRACE, my_field = %"hello world"); + }); + + handle.assert_finished(); +} + +#[test] +fn debug_shorthand() { + let (subscriber, handle) = subscriber::mock() + .event( + event::mock().with_fields( + field::mock("my_field") + .with_value(&debug("hello world")) + .only(), + ), + ) + .done() + .run_with_handle(); + with_default(subscriber, || { + event!(Level::TRACE, my_field = ?"hello world"); + }); + + handle.assert_finished(); +} + +#[test] +fn both_shorthands() { + let (subscriber, handle) = subscriber::mock() + .event( + event::mock().with_fields( + field::mock("display_field") + .with_value(&display("hello world")) + .and(field::mock("debug_field").with_value(&debug("hello world"))) + .only(), + ), + ) + .done() + .run_with_handle(); + with_default(subscriber, || { + event!(Level::TRACE, display_field = %"hello world", debug_field = ?"hello world"); + }); + + handle.assert_finished(); +} diff --git a/tokio-trace/tests/macros.rs b/tokio-trace/tests/macros.rs index 975920d1d..73cfb0d0a 100644 --- a/tokio-trace/tests/macros.rs +++ b/tokio-trace/tests/macros.rs @@ -10,6 +10,7 @@ extern crate tokio_trace; #[test] fn span() { + span!(Level::DEBUG, target: "foo_events", "foo", bar.baz = ?2, quux = %3, quuux = 4); span!(Level::DEBUG, target: "foo_events", "foo", bar.baz = 2, quux = 3); span!(Level::DEBUG, target: "foo_events", "foo", bar.baz = 2, quux = 4,); span!(Level::DEBUG, target: "foo_events", "foo"); @@ -18,72 +19,90 @@ fn span() { span!(Level::DEBUG, "foo", bar.baz = 2, quux = 4,); span!(Level::TRACE, "foo", bar.baz = 2, quux = 3); span!(Level::TRACE, "foo", bar.baz = 2, quux = 4,); + span!(Level::TRACE, "foo", bar.baz = ?2); + span!(Level::TRACE, "foo", bar.baz = %2); span!(Level::TRACE, "foo"); span!(Level::TRACE, "bar",); } #[test] fn trace_span() { + trace_span!(target: "foo_events", "foo", bar.baz = ?2, quux = %3, quuux = 4); trace_span!(target: "foo_events", "foo", bar.baz = 2, quux = 3); trace_span!(target: "foo_events", "foo", bar.baz = 2, quux = 4,); trace_span!(target: "foo_events", "foo"); trace_span!(target: "foo_events", "bar",); trace_span!("foo", bar.baz = 2, quux = 3); trace_span!("foo", bar.baz = 2, quux = 4,); + trace_span!("foo", bar.baz = ?2); + trace_span!("foo", bar.baz = %2); trace_span!("bar"); trace_span!("bar",); } #[test] fn debug_span() { + debug_span!(target: "foo_events", "foo", bar.baz = ?2, quux = %3, quuux = 4); debug_span!(target: "foo_events", "foo", bar.baz = 2, quux = 3); debug_span!(target: "foo_events", "foo", bar.baz = 2, quux = 4,); debug_span!(target: "foo_events", "foo"); debug_span!(target: "foo_events", "bar",); debug_span!("foo", bar.baz = 2, quux = 3); debug_span!("foo", bar.baz = 2, quux = 4,); + debug_span!("foo", bar.baz = ?2); + debug_span!("foo", bar.baz = %2); debug_span!("bar"); debug_span!("bar",); } #[test] fn info_span() { + info_span!(target: "foo_events", "foo", bar.baz = ?2, quux = %3, quuux = 4); info_span!(target: "foo_events", "foo", bar.baz = 2, quux = 3); info_span!(target: "foo_events", "foo", bar.baz = 2, quux = 4,); info_span!(target: "foo_events", "foo"); info_span!(target: "foo_events", "bar",); info_span!("foo", bar.baz = 2, quux = 3); info_span!("foo", bar.baz = 2, quux = 4,); + info_span!("foo", bar.baz = ?2); + info_span!("foo", bar.baz = %2); info_span!("bar"); info_span!("bar",); } #[test] fn warn_span() { + warn_span!(target: "foo_events", "foo", bar.baz = ?2, quux = %3, quuux = 4); warn_span!(target: "foo_events", "foo", bar.baz = 2, quux = 3); warn_span!(target: "foo_events", "foo", bar.baz = 2, quux = 4,); warn_span!(target: "foo_events", "foo"); warn_span!(target: "foo_events", "bar",); warn_span!("foo", bar.baz = 2, quux = 3); warn_span!("foo", bar.baz = 2, quux = 4,); + warn_span!("foo", bar.baz = ?2); + warn_span!("foo", bar.baz = %2); warn_span!("bar"); warn_span!("bar",); } #[test] fn error_span() { + error_span!(target: "foo_events", "foo", bar.baz = ?2, quux = %3, quuux = 4); error_span!(target: "foo_events", "foo", bar.baz = 2, quux = 3); error_span!(target: "foo_events", "foo", bar.baz = 2, quux = 4,); error_span!(target: "foo_events", "foo"); error_span!(target: "foo_events", "bar",); error_span!("foo", bar.baz = 2, quux = 3); error_span!("foo", bar.baz = 2, quux = 4,); + error_span!("foo", bar.baz = ?2); + error_span!("foo", bar.baz = %2); error_span!("bar"); error_span!("bar",); } #[test] fn span_root() { + span!(Level::DEBUG, target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 3); span!(Level::DEBUG, target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 3); span!(Level::DEBUG, target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 4,); span!(Level::DEBUG, target: "foo_events", parent: None, "foo"); @@ -246,6 +265,7 @@ fn error_span_with_parent() { #[test] fn event() { + event!(Level::DEBUG, foo = ?3, bar.baz = %2, quux = false); event!(Level::DEBUG, foo = 3, bar.baz = 2, quux = false); event!(Level::DEBUG, foo = 3, bar.baz = 3,); event!(Level::DEBUG, "foo"); @@ -253,7 +273,7 @@ fn event() { event!(Level::DEBUG, { foo = 3, bar.baz = 80 }, "quux"); event!(Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}", true); event!(Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); - event!(Level::DEBUG, { foo = 2, bar.baz = 78, }, "quux"); + event!(Level::DEBUG, { foo = ?2, bar.baz = %78 }, "quux"); event!(target: "foo_events", Level::DEBUG, foo = 3, bar.baz = 2, quux = false); event!(target: "foo_events", Level::DEBUG, foo = 3, bar.baz = 3,); event!(target: "foo_events", Level::DEBUG, "foo"); @@ -266,6 +286,7 @@ fn event() { #[test] fn trace() { + trace!(foo = ?3, bar.baz = %2, quux = false); trace!(foo = 3, bar.baz = 2, quux = false); trace!(foo = 3, bar.baz = 3,); trace!("foo"); @@ -273,7 +294,8 @@ fn trace() { trace!({ foo = 3, bar.baz = 80 }, "quux"); trace!({ foo = 2, bar.baz = 79 }, "quux {:?}", true); trace!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); - trace!({ foo = 2, bar.baz = 78, }, "quux"); + trace!({ foo = 2, bar.baz = 78 }, "quux"); + trace!({ foo = ?2, bar.baz = %78 }, "quux"); trace!(target: "foo_events", foo = 3, bar.baz = 2, quux = false); trace!(target: "foo_events", foo = 3, bar.baz = 3,); trace!(target: "foo_events", "foo"); @@ -286,6 +308,7 @@ fn trace() { #[test] fn debug() { + debug!(foo = ?3, bar.baz = %2, quux = false); debug!(foo = 3, bar.baz = 2, quux = false); debug!(foo = 3, bar.baz = 3,); debug!("foo"); @@ -293,7 +316,8 @@ fn debug() { debug!({ foo = 3, bar.baz = 80 }, "quux"); debug!({ foo = 2, bar.baz = 79 }, "quux {:?}", true); debug!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); - debug!({ foo = 2, bar.baz = 78, }, "quux"); + debug!({ foo = 2, bar.baz = 78 }, "quux"); + debug!({ foo = ?2, bar.baz = %78 }, "quux"); debug!(target: "foo_events", foo = 3, bar.baz = 2, quux = false); debug!(target: "foo_events", foo = 3, bar.baz = 3,); debug!(target: "foo_events", "foo"); @@ -301,12 +325,12 @@ fn debug() { debug!(target: "foo_events", { foo = 3, bar.baz = 80 }, "quux"); debug!(target: "foo_events", { foo = 2, bar.baz = 79 }, "quux {:?}", true); debug!(target: "foo_events", { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); - debug!(target: "foo_events", { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); debug!(target: "foo_events", { foo = 2, bar.baz = 78, }, "quux"); } #[test] fn info() { + info!(foo = ?3, bar.baz = %2, quux = false); info!(foo = 3, bar.baz = 2, quux = false); info!(foo = 3, bar.baz = 3,); info!("foo"); @@ -314,7 +338,8 @@ fn info() { info!({ foo = 3, bar.baz = 80 }, "quux"); info!({ foo = 2, bar.baz = 79 }, "quux {:?}", true); info!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); - info!({ foo = 2, bar.baz = 78, }, "quux"); + info!({ foo = 2, bar.baz = 78 }, "quux"); + info!({ foo = ?2, bar.baz = %78 }, "quux"); info!(target: "foo_events", foo = 3, bar.baz = 2, quux = false); info!(target: "foo_events", foo = 3, bar.baz = 3,); info!(target: "foo_events", "foo"); @@ -322,12 +347,12 @@ fn info() { info!(target: "foo_events", { foo = 3, bar.baz = 80 }, "quux"); info!(target: "foo_events", { foo = 2, bar.baz = 79 }, "quux {:?}", true); info!(target: "foo_events", { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); - info!(target: "foo_events", { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); info!(target: "foo_events", { foo = 2, bar.baz = 78, }, "quux"); } #[test] fn warn() { + warn!(foo = ?3, bar.baz = %2, quux = false); warn!(foo = 3, bar.baz = 2, quux = false); warn!(foo = 3, bar.baz = 3,); warn!("foo"); @@ -336,6 +361,7 @@ fn warn() { warn!({ foo = 2, bar.baz = 79 }, "quux {:?}", true); warn!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); warn!({ foo = 2, bar.baz = 78 }, "quux"); + warn!({ foo = ?2, bar.baz = %78 }, "quux"); warn!(target: "foo_events", foo = 3, bar.baz = 2, quux = false); warn!(target: "foo_events", foo = 3, bar.baz = 3,); warn!(target: "foo_events", "foo"); @@ -348,6 +374,7 @@ fn warn() { #[test] fn error() { + error!(foo = ?3, bar.baz = %2, quux = false); error!(foo = 3, bar.baz = 2, quux = false); error!(foo = 3, bar.baz = 3,); error!("foo"); @@ -356,6 +383,7 @@ fn error() { error!({ foo = 2, bar.baz = 79 }, "quux {:?}", true); error!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false); error!({ foo = 2, bar.baz = 78, }, "quux"); + error!({ foo = ?2, bar.baz = %78 }, "quux"); error!(target: "foo_events", foo = 3, bar.baz = 2, quux = false); error!(target: "foo_events", foo = 3, bar.baz = 3,); error!(target: "foo_events", "foo"); diff --git a/tokio-trace/tests/span.rs b/tokio-trace/tests/span.rs index d66fcb6ee..5c3bdd610 100644 --- a/tokio-trace/tests/span.rs +++ b/tokio-trace/tests/span.rs @@ -4,7 +4,11 @@ mod support; use self::support::*; use std::thread; -use tokio_trace::{field::display, subscriber::with_default, Level, Span}; +use tokio_trace::{ + field::{debug, display}, + subscriber::with_default, + Level, Span, +}; #[test] fn handles_to_the_same_span_are_equal() { @@ -547,3 +551,61 @@ fn contextual_child() { handle.assert_finished(); } + +#[test] +fn display_shorthand() { + let (subscriber, handle) = subscriber::mock() + .new_span( + span::mock().named("my_span").with_field( + field::mock("my_field") + .with_value(&display("hello world")) + .only(), + ), + ) + .done() + .run_with_handle(); + with_default(subscriber, || { + span!(Level::TRACE, "my_span", my_field = %"hello world"); + }); + + handle.assert_finished(); +} + +#[test] +fn debug_shorthand() { + let (subscriber, handle) = subscriber::mock() + .new_span( + span::mock().named("my_span").with_field( + field::mock("my_field") + .with_value(&debug("hello world")) + .only(), + ), + ) + .done() + .run_with_handle(); + with_default(subscriber, || { + span!(Level::TRACE, "my_span", my_field = ?"hello world"); + }); + + handle.assert_finished(); +} + +#[test] +fn both_shorthands() { + let (subscriber, handle) = subscriber::mock() + .new_span( + span::mock().named("my_span").with_field( + field::mock("display_field") + .with_value(&display("hello world")) + .and(field::mock("debug_field").with_value(&debug("hello world"))) + .only(), + ), + ) + .done() + .run_with_handle(); + with_default(subscriber, || { + span!(Level::TRACE, "my_span", display_field = %"hello world", debug_field = ?"hello world"); + }); + + handle.assert_finished(); +}