extern_executor 0.1.2

Async executor which delegates futures polling to external event-loop.
Documentation
fn main() {
    #[cfg(feature = "uv")]
    {
        let pkgconfig = pkg_config::Config::new();

        if pkgconfig.probe("libuv").is_err() {
            println!("cargo:rustc-link-lib=uv");
        }
    }

    #[cfg(feature = "cbindgen")]
    {
        use std::{env::var, path::Path};

        let profile = var("PROFILE")
            .expect("Unfortunately missing 'PROFILE' environment variable.");

        let out_dir = var("OUT_DIR")
            .expect("Unfortunately missing 'OUT_DIR' environment variable.");
        let out_dir = Path::new(&out_dir);

        let target_dir = out_dir.ancestors().find(|path| match path.file_name() {
            Some(name) if std::ffi::OsStr::new(&profile) == name => true,
            _ => false,
        }).expect("Unable to determine target directory");

        let source_dir = var("CARGO_MANIFEST_DIR")
            .expect("Unfortunately missing 'CARGO_MANIFEST_DIR' environment variable.");
        let source_dir = Path::new(&source_dir);

        let config_path = source_dir.join("cbindgen.toml");
        let config = cbindgen::Config::from_file(config_path)
            .expect("Unable to read cbindgen config");

        let header_dir = target_dir.join("include");

        std::fs::create_dir_all(&header_dir)
            .expect("Unable to create headers directory");

        for (needed, header_file, sym_filter) in &[
            (true, "rust_async_executor.h", (|name| !name.contains("_dart_") && !name.contains("_uv_")) as fn(&str) -> bool),
            (cfg!(feature = "uv"), "rust_async_executor_uv.h", |name| name.contains("_uv_")),
            (cfg!(feature = "dart"), "rust_async_executor_dart.h", |name| name.contains("_dart_"))
        ] {
            if *needed {
                let header_path = header_dir.join(&header_file);
                let header_guard = format!("__{}__", header_file.replace('.', "_").to_uppercase());
                let mut config = config.clone();

                config.include_guard = header_guard.into();
                config.export.exclude.extend(config.export.include.iter().filter(|name| !sym_filter(&name)).cloned());
                config.export.include = Vec::default();

                cbindgen::Builder::new()
                    .with_crate(source_dir)
                    .with_config(config)
                    .generate()
                    .expect("Unable to generate bindings")
                    .write_to_file(header_path);
            }
        }

        println!("cargo:rerun-if-changed=cbindgen.toml");
    }
}