via-cli 0.2.0

Run commands and API requests with 1Password-backed credentials without exposing secrets to your shell
Documentation
use std::env;
use std::time::{Duration, Instant};

pub struct TimingSpan {
    enabled: bool,
    label: String,
    started_at: Instant,
}

pub fn span(label: impl Into<String>) -> TimingSpan {
    TimingSpan {
        enabled: enabled(),
        label: label.into(),
        started_at: Instant::now(),
    }
}

pub fn event(label: impl AsRef<str>, detail: impl AsRef<str>) {
    if enabled() {
        eprintln!("via timing: {} {}", label.as_ref(), detail.as_ref());
    }
}

pub fn enabled() -> bool {
    env_flag("VIA_TIMING") || env_flag("VIA_DEBUG_TIMING")
}

impl TimingSpan {
    pub fn finish(self, detail: impl AsRef<str>) -> Duration {
        let elapsed = self.started_at.elapsed();
        if self.enabled {
            eprintln!(
                "via timing: {} {} ({:.1}ms)",
                self.label,
                detail.as_ref(),
                elapsed.as_secs_f64() * 1000.0
            );
        }
        elapsed
    }
}

fn env_flag(name: &str) -> bool {
    env::var(name)
        .map(|value| {
            let value = value.trim();
            !value.is_empty()
                && value != "0"
                && !value.eq_ignore_ascii_case("false")
                && !value.eq_ignore_ascii_case("off")
                && !value.eq_ignore_ascii_case("no")
        })
        .unwrap_or(false)
}