diff --git a/Cargo.toml b/Cargo.toml index c7086d5..fdb46f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ crc32fast = "1" [profile.release] strip = true -[build-dependencies] +[dev-dependencies] cbindgen = "0.27.0" [lib] diff --git a/build.rs b/build.rs deleted file mode 100644 index cbaba78..0000000 --- a/build.rs +++ /dev/null @@ -1,11 +0,0 @@ -// build.rs - -extern crate cbindgen; - -fn main() { - let crate_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); - - cbindgen::generate(crate_dir) - .expect("Unable to generate C bindings.") - .write_to_file("crc32fast.h"); -} diff --git a/src/lib.rs b/src/lib.rs index 2390417..301cd69 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -87,6 +87,8 @@ pub extern "C" fn crc32_hash(data: *const c_char, len: usize) -> u32 { mod tests { use super::*; use std::ptr; + use std::fs::{read, write}; + extern crate cbindgen; #[test] fn test_hasher_lifecycle() { @@ -144,4 +146,26 @@ mod tests { assert_eq!(sum, direct_sum, "Incremental update failed"); } } + + #[test] + fn test_crc32fast_bindings() -> Result<(), String> { + const BINDING: &str = "crc32fast.h"; + let crate_dir = std::env::var("CARGO_MANIFEST_DIR").map_err(|error| error.to_string())?; + + let mut expected = Vec::new(); + cbindgen::generate(crate_dir) + .map_err(|error| error.to_string())? + .write(&mut expected); + + let actual = read(BINDING).map_err(|error| error.to_string())?; + + if expected != actual { + write(BINDING, expected).map_err(|error| error.to_string())?; + return Err(format!( + "{BINDING} is not up-to-date, commit the generated file and try again" + )); + } + + Ok(()) + } }