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