From 217c572a343e982a0ee1ab5b1e4e9b64b1013678 Mon Sep 17 00:00:00 2001 From: Kishan Goli Date: Tue, 19 May 2026 21:34:58 -0700 Subject: [PATCH] bindgen implementation --- crates/vdb-ffi/Cargo.toml | 3 +++ crates/vdb-ffi/build.rs | 23 +++++++++++++++++++++++ crates/vdb-ffi/src/bindings.rs | 24 ------------------------ crates/vdb-ffi/src/engine.rs | 6 ++---- crates/vdb-ffi/src/lib.rs | 6 +++++- 5 files changed, 33 insertions(+), 29 deletions(-) create mode 100644 crates/vdb-ffi/build.rs delete mode 100644 crates/vdb-ffi/src/bindings.rs diff --git a/crates/vdb-ffi/Cargo.toml b/crates/vdb-ffi/Cargo.toml index a8dd816..c0445f0 100644 --- a/crates/vdb-ffi/Cargo.toml +++ b/crates/vdb-ffi/Cargo.toml @@ -5,3 +5,6 @@ edition = "2021" [lib] path = "src/lib.rs" + +[build-dependencies] +bindgen = "0.72" diff --git a/crates/vdb-ffi/build.rs b/crates/vdb-ffi/build.rs new file mode 100644 index 0000000..c87be6e --- /dev/null +++ b/crates/vdb-ffi/build.rs @@ -0,0 +1,23 @@ +use std::{env, path::PathBuf}; + +fn main() { + println!("cargo:rerun-if-changed=../../cpp/vector_engine_ffi.h"); + + let bindings = bindgen::Builder::default() + .header("../../cpp/vector_engine_ffi.h") + .clang_arg("-xc++") + .clang_arg("-std=c++17") + .clang_arg("-I../../cpp") + .allowlist_type("NativeVectorEngine") + .allowlist_type("NativeSearchResults") + .allowlist_function("native_.*") + .layout_tests(false) + .generate() + .expect("failed to generate FFI bindings with bindgen"); + + let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR was not set")); + + bindings + .write_to_file(out_dir.join("bindings.rs")) + .expect("failed to write generated bindings"); +} diff --git a/crates/vdb-ffi/src/bindings.rs b/crates/vdb-ffi/src/bindings.rs deleted file mode 100644 index 41594b2..0000000 --- a/crates/vdb-ffi/src/bindings.rs +++ /dev/null @@ -1,24 +0,0 @@ -#[repr(C)] -pub struct NativeVectorEngine { - _private: [u8; 0], // rust short hand for declaring "opaque" struct -} - -#[repr(C)] -pub struct NativeSearchResults { - _private: [u8; 0], -} - -unsafe extern "C" { - pub fn native_vector_engine_new() -> *mut NativeVectorEngine; - pub fn native_vector_engine_free(engine: *mut NativeVectorEngine); - - pub fn native_vector_engine_insert( engine: *mut NativeVectorEngine, id: *const std::os::raw::c_char, vector: *const f32, len: usize, ); - - pub fn native_vector_engine_delete( engine: *mut NativeVectorEngine, id: *const std::os::raw::c_char, ) -> bool; - pub fn native_vector_engine_search( engine: *const NativeVectorEngine, query: *const f32, len: usize, k: usize, ) -> *mut NativeSearchResults; - pub fn native_search_results_len(results: *const NativeSearchResults) -> usize; - - pub fn native_search_results_id_at( results: *const NativeSearchResults, index: usize, ) -> *const std::os::raw::c_char; - pub fn native_search_results_score_at( results: *const NativeSearchResults, index: usize, ) -> f32; - pub fn native_search_results_free(results: *mut NativeSearchResults); -} diff --git a/crates/vdb-ffi/src/engine.rs b/crates/vdb-ffi/src/engine.rs index df892cd..4aead3d 100644 --- a/crates/vdb-ffi/src/engine.rs +++ b/crates/vdb-ffi/src/engine.rs @@ -73,10 +73,8 @@ impl FfiSearchResults { pub fn id_at(&self, index: usize) -> String { let id_ptr = unsafe { native_search_results_id_at(self.handle, index) }; - unsafe { CStr::from_ptr(id_ptr) } - .to_str() - .expect("native search result ID must be valid") - .to_string() + unsafe { CStr::from_ptr(id_ptr) }.to_str().expect("native search result ID must be valid").to_string() + // first converting pointer to rust CStr, then rust string } pub fn score_at(&self, index: usize) -> f32 { diff --git a/crates/vdb-ffi/src/lib.rs b/crates/vdb-ffi/src/lib.rs index 8c4f91f..6ca15a5 100644 --- a/crates/vdb-ffi/src/lib.rs +++ b/crates/vdb-ffi/src/lib.rs @@ -1,4 +1,8 @@ -mod bindings; mod engine; +#[allow(non_camel_case_types, non_snake_case, non_upper_case_globals)] +mod bindings { + include!(concat!(env!("OUT_DIR"), "/bindings.rs")); +} + pub use engine::{FfiSearchResults, FfiVectorEngine};