Skip to main content

gix_trace/
enabled.rs

1pub use tracing::field;
2
3#[doc(hidden)]
4pub use tracing as __tracing;
5
6/// An entered span which will exit on drop.
7pub 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    /// Create a disabled span.
21    pub fn disabled() -> Self {
22        Self { inner: None }
23    }
24
25    /// Wrap an entered span from the `tracing` crate.
26    pub fn from_entered(span: tracing::span::EnteredSpan) -> Self {
27        Self { inner: Some(span) }
28    }
29
30    /// Record a single `field` to take `value`.
31    ///
32    /// ### Panics
33    ///
34    /// If the field name wasn't mentioned when the span was created.
35    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/// A macro to create a span.
57#[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/// Create an event with the given level.
89#[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}