use std::env;
use std::fs;
use std::path::PathBuf;
fn main() {
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
let nuget_url = "https://www.nuget.org/api/v2/package/NetworkDirect/2.0.1";
let package_path = out_path.join("pkg");
if !package_path.exists() {
let out_file = out_path.join("pkg.zip");
{
let mut response = reqwest::blocking::get(nuget_url).expect("Failed to donwload NetworkDirect NuGet package");
let mut file = fs::File::create(&out_file).expect("Failed to open output file");
response.copy_to(&mut file).expect("Failed to save file");
}
{
let file = fs::File::open(&out_file).expect("Failed to open output file");
let mut archive = zip::ZipArchive::new(file).unwrap();
for i in 0..archive.len() {
let mut entry = archive.by_index(i).unwrap();
let out_path = match entry.enclosed_name() {
Some(p) => {
if !p.starts_with("include/") && !p.starts_with("lib/") {
continue;
}
package_path.join(p)
}
None => continue,
};
if let Some(dir) = out_path.parent() {
fs::create_dir_all(dir).unwrap();
}
let mut out_file = fs::File::create(&out_path).unwrap();
std::io::copy(&mut entry, &mut out_file).unwrap();
}
}
}
let bindings = bindgen::Builder::default()
.clang_arg(format!("-I{}", package_path.join("include").to_str().unwrap()))
.header("src/bindings.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.derive_default(true)
.blocklist_type("_?GUID")
.blocklist_type("HRESULT")
.blocklist_type("sockaddr")
.blocklist_type("_?SOCKET_ADDRESS")
.blocklist_type("_?SOCKET_ADDRESS_LIST")
.blocklist_type("ADDRESS_FAMILY")
.blocklist_type("IUnknown.*")
.blocklist_type("_?OVERLAPPED.*")
.blocklist_type("BOOL")
.blocklist_type("CHAR")
.blocklist_item("IID_IND.+")
.blocklist_type("HANDLE")
.allowlist_function("NdStartup")
.allowlist_function("NdCleanup")
.allowlist_function("NdFlushProviders")
.allowlist_function("NdQueryAddressList")
.allowlist_function("NdResolveAddress")
.allowlist_function("NdCheckAddress")
.allowlist_function("NdOpenAdapter")
.allowlist_function("NdOpenV1Adapter")
.allowlist_type("ND2_.+")
.allowlist_var("ND2?_.+")
.allowlist_type("IND2?.+")
.rustified_enum("_ND2_REQUEST_TYPE")
.generate()
.expect("Unable to generate bindings");
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings");
}