lazyspec 0.8.0

A little TUI & CLI for project documentation.
Documentation
use std::fs::{File, OpenOptions};
use std::io::Write;
use std::sync::OnceLock;
use std::time::Instant;

static LOG_FILE: OnceLock<Option<File>> = OnceLock::new();
static START: OnceLock<Instant> = OnceLock::new();

fn log_file() -> Option<&'static File> {
    LOG_FILE
        .get_or_init(|| {
            if std::env::var("LAZYSPEC_LOG").is_err() {
                return None;
            }
            let path = std::env::var("LAZYSPEC_LOG_PATH")
                .unwrap_or_else(|_| "/tmp/lazyspec-tui.log".to_string());
            OpenOptions::new().create(true).append(true).open(path).ok()
        })
        .as_ref()
}

fn elapsed_ms() -> f64 {
    let start = START.get_or_init(Instant::now);
    start.elapsed().as_secs_f64() * 1000.0
}

pub fn enabled() -> bool {
    log_file().is_some()
}

pub fn log(msg: &str) {
    if let Some(file) = log_file() {
        let _ = writeln!(&*file, "[{:12.3}ms] {}", elapsed_ms(), msg);
    }
}

pub fn log_duration(label: &str, start: Instant) {
    if enabled() {
        let dur = start.elapsed();
        log(&format!("{}: {:.3}ms", label, dur.as_secs_f64() * 1000.0));
    }
}