libuv-sys-lite 1.48.3

Tiny, raw bindings to libuv without linking to it
Documentation
use std::path::PathBuf;

fn generate_bindings() {
  let mut builder = bindgen::builder().header("libuv-1.48.0-include/uv.h");
  builder = builder
    .allowlist_type("uv_.+")
    .allowlist_type("UV_.+")
    .allowlist_var("uv_.+")
    .allowlist_var("UV_.+")
    .allowlist_type("FILE")
    .default_enum_style(bindgen::EnumVariation::NewType {
      is_bitfield: false,
      is_global: false,
    });
  builder
    .clang_arg("-Ilibuv-1.48.0-include")
    .generate()
    .unwrap()
    .write_to_file(PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("bindings.rs"))
    .unwrap();
}

fn env_is_set(var: &str) -> bool {
  std::env::var(var).is_ok()
}

fn cfg_is_set(var: &str) -> bool {
  env_is_set(&format!(
    "CARGO_FEATURE_{}",
    var.to_uppercase().replace('-', "_")
  ))
}

fn main() {
  if env_is_set("LIBUV_SYS_LITE_BINDGEN") || cfg_is_set("bindgen") {
    generate_bindings();
    return;
  }

  let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap_or_default();
  let target_arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
  match (&*target_os, &*target_arch) {
    ("windows", "x86_64") | ("linux" | "macos", "x86_64" | "aarch64") => {
      let path = PathBuf::from("src").join(format!("bindings_{}_{}.rs", target_os, target_arch));
      let dest = PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("bindings.rs");
      std::fs::copy(&path, &dest).unwrap();
    }
    _ => generate_bindings(),
  }
}