autumn-cli 0.2.0

CLI tool for the Autumn web framework
fn main() {
    println!("cargo:rerun-if-changed=src/");
    println!("cargo:rerun-if-changed=static/css/input.css");
    println!("cargo:rerun-if-changed=tailwind.config.js");
    println!("cargo:rerun-if-changed=target/autumn/tailwindcss");
    println!("cargo:rerun-if-env-changed=PATH");
    #[cfg(target_os = "windows")]
    println!("cargo:rerun-if-env-changed=PATHEXT");

    if let Some(tailwind) = find_tailwind_cli() {
        let status = std::process::Command::new(&tailwind)
            .args([
                "-i",
                "static/css/input.css",
                "-o",
                "static/css/autumn.css",
                "--content",
                "src/**/*.rs",
                "--minify",
            ])
            .status()
            .expect("Failed to run Tailwind CLI");

        if !status.success() {
            panic!("Tailwind CSS compilation failed");
        }
    } else {
        // Output a warning ONLY if this is not part of a documentation build
        // or a test where we don't care about CSS.
        // Usually, `autumn dev` will complain if it is actually required.
        // As per DX audit, removing the warning or making it quieter is better,
        // we'll just not emit a warning for missing tailwind when it's optional.
    }
}

fn find_tailwind_cli() -> Option<std::path::PathBuf> {
    // 1. Check local download (from `autumn setup`)
    let local = std::path::PathBuf::from("target/autumn/tailwindcss");
    if local.exists() {
        return Some(local);
    }

    // 2. Check PATH
    if let Some(path) = which("tailwindcss") {
        return Some(path);
    }

    // 3. Return None to treat this as optional.
    None
}

fn which(binary: &str) -> Option<std::path::PathBuf> {
    let path_var = std::env::var_os("PATH")?;
    for dir in std::env::split_paths(&path_var) {
        let candidate = dir.join(binary);
        if candidate.exists() {
            return Some(candidate);
        }
        #[cfg(target_os = "windows")]
        {
            let candidate_exe = dir.join(format!("{binary}.exe"));
            if candidate_exe.exists() {
                return Some(candidate_exe);
            }
        }
    }
    None
}