neutron-engine 0.1.3

A lightweight markup parser for the Neutron styling language (.nt)
Documentation
use std::env;
use std::path::PathBuf;
use std::process::Command;

fn main() {
    println!("cargo:rerun-if-changed=build.rs");
    println!("cargo:rerun-if-changed=iris-language-1.0.0.vsix");
    println!("cargo:rerun-if-changed=npm-iris-engine/scripts/install-universal.js");

    // Skip if CI environment
    if env::var("CI").is_ok() || env::var("CONTINUOUS_INTEGRATION").is_ok() {
        println!("cargo:warning=CI environment detected. Skipping editor support install.");
        return;
    }

    // Delegate universal editor installation to Node.js script (shared with npm)
    let universal_script = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap_or_default())
        .join("npm-iris-engine")
        .join("scripts")
        .join("install-universal.js");

    if universal_script.exists() {
        let node_cmd = if cfg!(target_os = "windows") { "node.exe" } else { "node" };
        let result = Command::new(node_cmd)
            .arg(&universal_script)
            .output();

        match result {
            Ok(output) => {
                if !output.status.success() {
                    let stdout = String::from_utf8_lossy(&output.stdout);
                    let stderr = String::from_utf8_lossy(&output.stderr);
                    for line in stdout.lines() {
                        println!("cargo:warning={}", line);
                    }
                    for line in stderr.lines() {
                        println!("cargo:warning={}", line);
                    }
                    println!("cargo:warning=⚠️ Universal installer exited with non-zero status.");
                }
            }
            Err(e) => {
                println!("cargo:warning=❌ Could not run Node.js universal installer: {}", e);
                println!("cargo:warning=   Falling back to legacy VSCode-only install...");
                fallback_vscode_install();
            }
        }
    } else {
        println!("cargo:warning=Universal installer script not found at {:?}. Skipping.", universal_script);
    }
}

fn fallback_vscode_install() {
    let code_cmd = if cfg!(target_os = "windows") { "code.cmd" } else { "code" };

    let vscode_check = Command::new(code_cmd).arg("--version").output();
    if vscode_check.is_err() {
        println!("cargo:warning=VSCode not found. Skipping.");
        return;
    }

    let vsix_path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap_or_default())
        .join("iris-language-1.0.0.vsix");

    if !vsix_path.exists() {
        println!("cargo:warning=VSCode extension .vsix not found. Skipping.");
        return;
    }

    let result = Command::new(code_cmd)
        .arg("--install-extension")
        .arg(&vsix_path)
        .arg("--force")
        .output();

    match result {
        Ok(output) if output.status.success() => {
            println!("cargo:warning=✅ VSCode extension installed.");
        }
        Ok(output) => {
            println!("cargo:warning=❌ VSCode install failed: {}", String::from_utf8_lossy(&output.stderr));
        }
        Err(e) => {
            println!("cargo:warning=❌ Error: {}", e);
        }
    }
}