1use std::env;
2use std::time::{Duration, Instant};
3
4pub struct TimingSpan {
5 enabled: bool,
6 label: String,
7 started_at: Instant,
8}
9
10pub fn span(label: impl Into<String>) -> TimingSpan {
11 TimingSpan {
12 enabled: enabled(),
13 label: label.into(),
14 started_at: Instant::now(),
15 }
16}
17
18pub fn event(label: impl AsRef<str>, detail: impl AsRef<str>) {
19 if enabled() {
20 eprintln!("via timing: {} {}", label.as_ref(), detail.as_ref());
21 }
22}
23
24pub fn enabled() -> bool {
25 env_flag("VIA_TIMING") || env_flag("VIA_DEBUG_TIMING")
26}
27
28impl TimingSpan {
29 pub fn finish(self, detail: impl AsRef<str>) -> Duration {
30 let elapsed = self.started_at.elapsed();
31 if self.enabled {
32 eprintln!(
33 "via timing: {} {} ({:.1}ms)",
34 self.label,
35 detail.as_ref(),
36 elapsed.as_secs_f64() * 1000.0
37 );
38 }
39 elapsed
40 }
41}
42
43fn env_flag(name: &str) -> bool {
44 env::var(name)
45 .map(|value| {
46 let value = value.trim();
47 !value.is_empty()
48 && value != "0"
49 && !value.eq_ignore_ascii_case("false")
50 && !value.eq_ignore_ascii_case("off")
51 && !value.eq_ignore_ascii_case("no")
52 })
53 .unwrap_or(false)
54}