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}