Skip to main content

hotshot_utils/anytrace/
macros.rs

1/// Print the file and line number of the location this macro is invoked
2///
3/// Note: temporarily prints only a null string to reduce verbosity of logging
4#[macro_export]
5macro_rules! line_info {
6    () => {
7        format!("")
8    };
9}
10pub use line_info;
11
12/// Create an error at the trace level.
13///
14/// The argument can be either:
15///   - an expression implementing `Display`
16///   - a string literal
17///   - a format string, similar to the `format!()` macro
18#[macro_export]
19macro_rules! trace {
20  ($message:literal) => {
21      $crate::anytrace::Error {
22        level: $crate::anytrace::Level::Trace,
23        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($message))
24      }
25  };
26  ($error:expr) => {
27      $crate::anytrace::Error {
28        level: $crate::anytrace::Level::Trace,
29        message: format!("{}: {}", $crate::anytrace::line_info!(), $error)
30      }
31  };
32  ($fmt:expr, $($arg:tt)*) => {
33      $crate::anytrace::Error {
34        level: $crate::anytrace::Level::Trace,
35        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($fmt, $($arg)*))
36      }
37  };
38}
39pub use trace;
40
41/// Create an error at the debug level.
42///
43/// The argument can be either:
44///   - an expression implementing `Display`
45///   - a string literal
46///   - a format string, similar to the `format!()` macro
47#[macro_export]
48macro_rules! debug {
49  ($message:literal) => {
50      $crate::anytrace::Error {
51        level: $crate::anytrace::Level::Debug,
52        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($message))
53      }
54  };
55  ($error:expr) => {
56      $crate::anytrace::Error {
57        level: $crate::anytrace::Level::Debug,
58        message: format!("{}: {}", $crate::anytrace::line_info!(), $error)
59      }
60  };
61  ($fmt:expr, $($arg:tt)*) => {
62      $crate::anytrace::Error {
63        level: $crate::anytrace::Level::Debug,
64        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($fmt, $($arg)*))
65      }
66  };
67}
68pub use debug;
69
70/// Create an error at the info level.
71///
72/// The argument can be either:
73///   - an expression implementing `Display`
74///   - a string literal
75///   - a format string, similar to the `format!()` macro
76#[macro_export]
77macro_rules! info {
78  ($message:literal) => {
79      $crate::anytrace::Error {
80        level: $crate::anytrace::Level::Info,
81        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($message))
82      }
83  };
84  ($error:expr) => {
85      $crate::anytrace::Error {
86        level: $crate::anytrace::Level::Info,
87        message: format!("{}: {}", $crate::anytrace::line_info!(), $error)
88      }
89  };
90  ($fmt:expr, $($arg:tt)*) => {
91      $crate::anytrace::Error {
92        level: $crate::anytrace::Level::Info,
93        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($fmt, $($arg)*))
94      }
95  };
96}
97pub use info;
98
99/// Create an error at the warn level.
100///
101/// The argument can be either:
102///   - an expression implementing `Display`
103///   - a string literal
104///   - a format string, similar to the `format!()` macro
105#[macro_export]
106macro_rules! warn {
107  ($message:literal) => {
108      $crate::anytrace::Error {
109        level: $crate::anytrace::Level::Warn,
110        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($message))
111      }
112  };
113  ($error:expr) => {
114      $crate::anytrace::Error {
115        level: $crate::anytrace::Level::Warn,
116        message: format!("{}: {}", $crate::anytrace::line_info!(), $error)
117      }
118  };
119  ($fmt:expr, $($arg:tt)*) => {
120      $crate::anytrace::Error {
121        level: $crate::anytrace::Level::Warn,
122        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($fmt, $($arg)*))
123      }
124  };
125}
126pub use crate::warn;
127
128/// Create an error at the error level.
129///
130/// The argument can be either:
131///   - an expression implementing `Display`
132///   - a string literal
133///   - a format string, similar to the `format!()` macro
134#[macro_export]
135macro_rules! error {
136  ($message:literal) => {
137      $crate::anytrace::Error {
138        level: $crate::anytrace::Level::Error,
139        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($message))
140      }
141  };
142  ($error:expr) => {
143      $crate::anytrace::Error {
144        level: $crate::anytrace::Level::Error,
145        message: format!("{}: {}", $crate::anytrace::line_info!(), $error)
146      }
147  };
148  ($fmt:expr, $($arg:tt)*) => {
149      $crate::anytrace::Error {
150        level: $crate::anytrace::Level::Error,
151        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($fmt, $($arg)*))
152      }
153  };
154}
155pub use error;
156
157/// Log an `Error` at the corresponding level.
158#[macro_export]
159macro_rules! log {
160    ($result:expr) => {
161        if let Err(ref error) = $result {
162            let mut error_level = error.level;
163            if error_level == $crate::anytrace::Level::Unspecified {
164                error_level = $crate::anytrace::DEFAULT_LOG_LEVEL;
165            }
166
167            match error_level {
168                $crate::anytrace::Level::Trace => {
169                    tracing::trace!("{}", error.message);
170                },
171                $crate::anytrace::Level::Debug => {
172                    tracing::debug!("{}", error.message);
173                },
174                $crate::anytrace::Level::Info => {
175                    tracing::info!("{}", error.message);
176                },
177                $crate::anytrace::Level::Warn => {
178                    tracing::warn!("{}", error.message);
179                },
180                $crate::anytrace::Level::Error => {
181                    tracing::error!("{}", error.message);
182                },
183                // impossible
184                $crate::anytrace::Level::Unspecified => {},
185            }
186        }
187    };
188}
189pub use log;
190
191/// Check that the given condition holds, otherwise return an error.
192///
193/// The argument can be either:
194///   - a condition, in which case a generic error is logged at the `Unspecified` level.
195///   - a condition and a string literal, in which case the provided literal is logged at the `Unspecified` level.
196///   - a condition and a format expression, in which case the message is formatted and logged at the `Unspecified` level.
197///   - a condition and an `Error`, in which case the given error is logged unchanged.
198#[macro_export]
199macro_rules! ensure {
200  ($condition:expr) => {
201      if !$condition {
202        let result = Err($crate::anytrace::Error {
203          level: $crate::anytrace::Level::Unspecified,
204          message: format!("{}: condition '{}' failed.", $crate::anytrace::line_info!(), stringify!($condition))
205        });
206
207        $crate::anytrace::log!(result);
208
209        return result;
210     }
211  };
212  ($condition:expr, $message:literal) => {
213      if !$condition {
214        let result = Err($crate::anytrace::Error {
215          level: $crate::anytrace::Level::Unspecified,
216          message: format!("{}: {}", $crate::anytrace::line_info!(), format!($message))
217        });
218
219        $crate::anytrace::log!(result);
220
221        return result;
222      }
223  };
224  ($condition:expr, $fmt:expr, $($arg:tt)*) => {
225      if !$condition {
226        let result = Err($crate::anytrace::Error {
227          level: $crate::anytrace::Level::Unspecified,
228          message: format!("{}: {}", $crate::anytrace::line_info!(), format!($fmt, $($arg)*))
229        });
230
231        $crate::anytrace::log!(result);
232
233        return result;
234      }
235  };
236  ($condition:expr, $error:expr) => {
237      if !$condition {
238        let result = Err($error);
239
240        $crate::anytrace::log!(result);
241
242        return result;
243      }
244  };
245}
246pub use ensure;
247
248/// Return an error.
249///
250/// The argument can be either:
251///   - nothing, in which case a generic message is logged at the `Unspecified` level.
252///   - a string literal, in which case the provided literal is logged at the `Unspecified` level.
253///   - a format expression, in which case the message is formatted and logged at the `Unspecified` level.
254///   - an `Error`, in which case the given error is logged unchanged.
255#[macro_export]
256macro_rules! bail {
257  () => {
258      let result = Err($crate::anytrace::Error {
259        level: $crate::anytrace::Level::Unspecified,
260        message: format!("{}: bailed.", $crate::anytrace::line_info!()),
261      });
262
263      $crate::anytrace::log!(result);
264
265      return result;
266  };
267  ($message:literal) => {
268      let result = Err($crate::anytrace::Error {
269        level: $crate::anytrace::Level::Unspecified,
270        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($message))
271      });
272
273      $crate::anytrace::log!(result);
274
275      return result;
276  };
277  ($fmt:expr, $($arg:tt)*) => {
278      let result = Err($crate::anytrace::Error {
279        level: $crate::anytrace::Level::Unspecified,
280        message: format!("{}: {}", $crate::anytrace::line_info!(), format!($fmt, $($arg)*))
281      });
282
283      $crate::anytrace::log!(result);
284
285      return result;
286  };
287  ($error:expr) => {
288      let result = Err($error);
289
290      $crate::anytrace::log!(result);
291
292      return result;
293  };
294}
295pub use bail;