tree-sitter-blazor 0.1.3

Tree-sitter grammar for Blazor/Razor syntax
Documentation
use std::path::{Path, PathBuf};

#[cfg(target_os = "macos")]
fn configure_macos_archiver() {
    use std::fs;
    use std::os::unix::fs::PermissionsExt;

    if std::env::var_os("AR").is_some() {
        return;
    }

    let out_dir =
        std::env::var_os("OUT_DIR").map_or_else(|| PathBuf::from("target"), PathBuf::from);
    let wrapper = out_dir.join("bsd-ar-wrapper.sh");
    let script = r#"#!/usr/bin/env bash
set -euo pipefail
args=()
for arg in "$@"; do
  if [[ "$arg" =~ ^[A-Za-z-]+$ ]]; then
    args+=("${arg//D/}")
  else
    args+=("$arg")
  fi
done
exec /usr/bin/ar "${args[@]}"
"#;

    let _ = fs::write(&wrapper, script);
    let _ = fs::set_permissions(&wrapper, fs::Permissions::from_mode(0o755));
    std::env::set_var("AR", wrapper);
}

fn main() {
    #[cfg(target_os = "macos")]
    configure_macos_archiver();

    let mut build = cc::Build::new();
    build.file("src/parser.c").include("src");

    let scanner_path = Path::new("src/scanner.c");
    if scanner_path.exists() {
        build.file(scanner_path);
        println!("cargo:rerun-if-changed=src/scanner.c");
    }

    build.compile("tree-sitter-blazor");

    println!("cargo:rerun-if-changed=grammar.js");
    println!("cargo:rerun-if-changed=src/parser.c");
    println!("cargo:rerun-if-changed=src/node-types.json");
}