tracing_opentelemetry_ext/
macros.rs

1/// # Usages
2///
3/// ```rust
4/// use tracing_ext::trace;
5///
6/// #[derive(Debug, thiserror::Error)]
7/// enum Error {
8///     #[error("")]
9///     A,
10///     #[error("")]
11///     B(String),
12/// }
13///
14/// fn do_something() -> Result<(), Error> {
15///     let result: Result<(), String> = Ok(());
16///     match result {
17///         Ok(s) => s,
18///         // Use:
19///         Err(err) => return trace!(Err(Error::A)),
20///         // Equivalent code:
21///         Err(err) => {
22///             let err = Error::A;
23///             tracing::error!("{}", err);
24///             return Err(err);
25///         }
26///     };
27///
28///     // Using without constructor
29///     None.ok_or(trace!(Error::A, "b error: {}", "something"))?;
30///     // Equivalent code:
31///     None.ok_or({
32///         tracing::error!("b error: {}", "something");
33///         Error::A
34///     })?;
35///
36///     // Using with constructor
37///     result.clone().map_err(trace!(Error::B))?;
38///     // Equivalent code:
39///     result.map_err(|err| {
40///         let err = Error::B(err);
41///         tracing::error!("{}", err);
42///         err
43///     })?;
44///
45///     Ok(())
46/// }
47/// ```
48#[macro_export]
49macro_rules! trace {
50    (Err($err: expr)) => {{
51        let err = $err;
52        tracing::error!("{}", err);
53        Err(err)
54    }};
55    (|| $err: expr) => {{
56        || {
57            let err = $err;
58            tracing::error!("{}", err);
59            err
60        }
61    }};
62    ($ret: expr, $($err:expr),+) => {{
63        tracing::error!($($err),+);
64        $ret
65    }};
66    ($err_kind: path) => {{
67        |err| {
68            let err = $err_kind(err);
69            tracing::error!("{}", err);
70            err
71        }
72    }};
73}