sublime-syntaxes 0.2.0

Precompiled Sublime Text syntax definitions for languages not in syntect's defaults
Documentation
use std::path::Path;

use syntect::dumps::dump_binary;
use syntect::parsing::{SyntaxDefinition, SyntaxSetBuilder};

fn main() {
    println!("cargo::rerun-if-changed=syntaxes/");

    let syntaxes_dir = Path::new("syntaxes");
    let mut builder = SyntaxSetBuilder::new();
    builder.add_plain_text_syntax();

    for entry in std::fs::read_dir(syntaxes_dir).expect("failed to read syntaxes/ directory") {
        let entry = entry.expect("failed to read directory entry");
        let path = entry.path();
        if path.extension().and_then(|e| e.to_str()) == Some("sublime-syntax") {
            let src = std::fs::read_to_string(&path)
                .unwrap_or_else(|e| panic!("failed to read {}: {e}", path.display()));
            match SyntaxDefinition::load_from_str(&src, true, None) {
                Ok(syntax) => builder.add(syntax),
                Err(e) => {
                    println!("cargo::warning=skipping {}: {e}", path.display());
                }
            }
        }
    }

    let syntax_set = builder.build();
    let binary = dump_binary(&syntax_set);

    let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR not set");
    let out_path = Path::new(&out_dir).join("syntaxes.bin");
    std::fs::write(&out_path, binary)
        .unwrap_or_else(|e| panic!("failed to write {}: {e}", out_path.display()));
}