1use std::{sync::Arc, time::Duration};
2
3pub(crate) type Callback = Arc<dyn Fn(&Info<'_>)>;
4
5#[allow(unused_imports)]
6pub(crate) use inner::metric;
7
8#[derive(Debug)]
9pub struct Info<'a> {
12 pub elapsed: Duration,
14 pub statement: &'a crate::Statement,
16 pub failed: bool,
18}
19
20mod inner {
21 #[allow(unused_macros)]
22 macro_rules! metric {
23 ($metric_callback:expr, $stmt:expr, $code:block) => {{
24 let _start = $metric_callback.is_some().then(std::time::SystemTime::now);
25 let res = $code;
26 if let (Some(_start), Some(callback)) = (_start, $metric_callback.as_deref()) {
27 let info = crate::metric::Info {
28 elapsed: _start.elapsed().unwrap_or_default(),
29 statement: $stmt,
30 failed: res.is_err(),
31 };
32 callback(&info);
33 }
34 res
35 }};
36 }
37 pub(crate) use metric;
38}