webbind 0.1.44

Rust bindings for the web api, auto-generated from WebIDL
Documentation
use convert_case::{Case, Casing};
use std::{env, fs, path::PathBuf};

fn main() {
    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR"));
    let src_dir = manifest_dir.join("src");

    println!("cargo:rerun-if-changed={}", src_dir.display());

    let mut files: Vec<PathBuf> = fs::read_dir(&src_dir)
        .expect("read_dir src failed")
        .filter_map(|e| e.ok())
        .map(|e| e.path())
        .filter(|p| p.is_file())
        .filter(|p| p.extension().and_then(|s| s.to_str()) == Some("rs"))
        .filter(|p| {
            let file = p.file_name().and_then(|s| s.to_str()).unwrap_or("");
            file != "lib.rs" && file != "mod.rs"
        })
        .collect();

    files.sort_by(|a, b| a.file_name().cmp(&b.file_name()));

    let mut out = String::new();
    out.push_str("// @generated by build.rs — do not edit manually\n");

    for path in files {
        let stem = path.file_stem().unwrap().to_str().unwrap();
        let mut ident = stem.to_case(Case::Snake);
        if ident.chars().next().map_or(false, |c| c.is_ascii_digit()) {
            ident.insert(0, '_');
        }

        out.push_str(&format!("#[path = {:?}]\n", path.to_string_lossy()));
        out.push_str(&format!("pub mod {};\n", ident));
        out.push_str(&format!("pub use {}::*;\n\n", ident));
    }

    let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
    fs::write(out_dir.join("generated_mods.rs"), out).expect("write generated_mods.rs");
}