treease-cli 1.1.0

Command-line interface for querying, transforming, and previewing structured documents with Treease
Documentation
use std::env;
use std::fs;
use std::path::{Path, PathBuf};

fn main() {
    println!("cargo:rerun-if-changed=Cargo.toml");
    println!("cargo:rerun-if-env-changed=TREEASE_WEB_ASSET_BASE_URL");

    let manifest_path =
        PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR should be set"))
            .join("Cargo.toml");
    let version = read_wasm_release_date(&manifest_path)
        .expect("Cargo.toml must define package.metadata.treease.wasm_release_date");
    let base_url = env::var("TREEASE_WEB_ASSET_BASE_URL")
        .unwrap_or_else(|_| "https://treease.com/cli-assets".to_string());

    let out_dir = PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR should be set"));
    let generated_path = out_dir.join("treease_web_config.rs");
    fs::write(
        generated_path,
        format!(
            "pub(super) const WEB_ASSET_VERSION: &str = {:?};\n\
             pub(super) const DEFAULT_WEB_ASSET_BASE_URL: &str = {:?};\n",
            version, base_url
        ),
    )
    .expect("generated web config should be writable");
}

fn read_wasm_release_date(manifest_path: &Path) -> Option<String> {
    let manifest = fs::read_to_string(manifest_path).ok()?;
    manifest.lines().find_map(|line| {
        let trimmed = line.trim();
        if !trimmed.starts_with("wasm_release_date") {
            return None;
        }
        let (_, value) = trimmed.split_once('=')?;
        let value = value.trim().trim_matches('"');
        if value.len() == 8 && value.chars().all(|ch| ch.is_ascii_digit()) {
            Some(value.to_string())
        } else {
            None
        }
    })
}