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