1pub use tracing::field;
2
3#[doc(hidden)]
4pub use tracing as __tracing;
5
6pub struct Span {
8 inner: Option<tracing::span::EnteredSpan>,
9}
10
11impl Clone for Span {
12 fn clone(&self) -> Self {
13 Self {
14 inner: self.inner.as_ref().map(|s| tracing::Span::clone(s).entered()),
15 }
16 }
17}
18
19impl Span {
20 pub fn disabled() -> Self {
22 Self { inner: None }
23 }
24
25 pub fn from_entered(span: tracing::span::EnteredSpan) -> Self {
27 Self { inner: Some(span) }
28 }
29
30 pub fn record<V>(&self, field: &str, value: V) -> &Self
36 where
37 V: field::Value,
38 {
39 if let Some(inner) = &self.inner {
40 inner.record(field, value);
41 }
42 self
43 }
44}
45
46#[doc(hidden)]
47impl crate::Level {
48 pub const fn into_tracing_level(self) -> tracing::Level {
49 match self {
50 crate::Level::Coarse => tracing::Level::INFO,
51 crate::Level::Detail => tracing::Level::DEBUG,
52 }
53 }
54}
55
56#[macro_export]
58macro_rules! span {
59 (target: $target:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {{
60 if $lvl > $crate::MAX_LEVEL {
61 $crate::Span::disabled()
62 } else {
63 $crate::Span::from_entered(
64 $crate::__tracing::span!(target: $target, $lvl.into_tracing_level(), $name, $($fields)*).entered()
65 )
66 }
67 }};
68 (target: $target:expr, $lvl:expr, $name:expr) => {
69 $crate::span!(target: $target, $lvl, $name,)
70 };
71 ($lvl:expr, $name:expr, $($fields:tt)*) => {
72 $crate::span!(
73 target: module_path!(),
74 $lvl,
75 $name,
76 $($fields)*
77 )
78 };
79 ($lvl:expr, $name:expr) => {
80 $crate::span!(
81 target: module_path!(),
82 $lvl,
83 $name,
84 )
85 };
86}
87
88#[macro_export]
90macro_rules! event {
91 (target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> (
92 $crate::__tracing::event!(target: $target, $lvl, $($fields)*)
93 );
94 (target: $target:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
95 $crate::event!(
96 target: $target,
97 $lvl,
98 { message = format_args!($($arg)+), $($fields)* }
99 )
100 );
101 (target: $target:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
102 $crate::event!(target: $target, $lvl, { $($k).+ = $($fields)* })
103 );
104 (target: $target:expr, $lvl:expr, $($arg:tt)+ ) => (
105 $crate::event!(target: $target, $lvl, { $($arg)+ })
106 );
107 ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
108 $crate::event!(
109 target: module_path!(),
110 $lvl,
111 { message = format_args!($($arg)+), $($fields)* }
112 )
113 );
114 ($lvl:expr, $($k:ident).+ = $($field:tt)*) => (
115 $crate::event!(
116 target: module_path!(),
117 $lvl,
118 { $($k).+ = $($field)*}
119 )
120 );
121 ($lvl:expr, $($k:ident).+, $($field:tt)*) => (
122 $crate::event!(
123 target: module_path!(),
124 $lvl,
125 { $($k).+, $($field)*}
126 )
127 );
128 ($lvl:expr, ?$($k:ident).+, $($field:tt)*) => (
129 $crate::event!(
130 target: module_path!(),
131 $lvl,
132 { ?$($k).+, $($field)*}
133 )
134 );
135 ($lvl:expr, %$($k:ident).+, $($field:tt)*) => (
136 $crate::event!(
137 target: module_path!(),
138 $lvl,
139 { %$($k).+, $($field)*}
140 )
141 );
142 ($lvl:expr, ?$($k:ident).+) => (
143 $crate::event!($lvl, ?$($k).+,)
144 );
145 ($lvl:expr, %$($k:ident).+) => (
146 $crate::event!($lvl, %$($k).+,)
147 );
148 ($lvl:expr, $($k:ident).+) => (
149 $crate::event!($lvl, $($k).+,)
150 );
151 ( $lvl:expr, $($arg:tt)+ ) => (
152 $crate::event!(target: module_path!(), $lvl, { $($arg)+ })
153 );
154}