harn-cli 0.10.54

CLI for the Harn programming language — run, test, REPL, format, and lint
Documentation
const BUILD_REVISION_ENV: &str = "HARN_BUILD_REVISION";

pub fn emit() {
    println!("cargo:rerun-if-env-changed={BUILD_REVISION_ENV}");

    let raw = std::env::var(BUILD_REVISION_ENV).ok();
    let revision = normalize(raw.as_deref())
        .unwrap_or_else(|message| panic!("{BUILD_REVISION_ENV} {message}"));
    println!(
        "cargo:rustc-env={BUILD_REVISION_ENV}={}",
        revision.unwrap_or_default()
    );
}

pub fn normalize(raw: Option<&str>) -> Result<Option<&str>, &'static str> {
    let Some(raw) = raw else {
        return Ok(None);
    };
    let revision = raw.trim();
    if revision.is_empty() {
        return Ok(None);
    }
    if !matches!(revision.len(), 40 | 64)
        || !revision
            .bytes()
            .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte))
    {
        return Err("must be a full lowercase 40- or 64-character hexadecimal object ID");
    }
    Ok(Some(revision))
}