Skip to main content

via/
timing.rs

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}