1use fret_core::time::Instant;
2use std::time::Duration;
3
4#[inline]
5pub fn measure<T>(enabled: bool, f: impl FnOnce() -> T) -> (T, Option<Duration>) {
6 if !enabled {
7 return (f(), None);
8 }
9 let started = Instant::now();
10 let out = f();
11 (out, Some(started.elapsed()))
12}
13
14#[inline]
15pub fn measure_span<T>(
16 time_enabled: bool,
17 span_enabled: bool,
18 make_span: impl FnOnce() -> tracing::Span,
19 f: impl FnOnce() -> T,
20) -> (T, Option<Duration>) {
21 if !time_enabled && !span_enabled {
22 return (f(), None);
23 }
24
25 let started = time_enabled.then(Instant::now);
26 let span = span_enabled
27 .then(make_span)
28 .unwrap_or_else(tracing::Span::none);
29 let _guard = span.enter();
30 let out = f();
31 (out, started.map(|s| s.elapsed()))
32}
33
34#[inline]
35pub fn measure_span_with<T>(
36 time_enabled: bool,
37 span_enabled: bool,
38 make_span: impl FnOnce() -> tracing::Span,
39 f: impl FnOnce(&tracing::Span) -> T,
40) -> (T, Option<Duration>) {
41 if !time_enabled && !span_enabled {
42 return (f(&tracing::Span::none()), None);
43 }
44
45 let started = time_enabled.then(Instant::now);
46 let span = span_enabled
47 .then(make_span)
48 .unwrap_or_else(tracing::Span::none);
49 let _guard = span.enter();
50 let out = f(&span);
51 (out, started.map(|s| s.elapsed()))
52}