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
}
}};
}