commit 88a113ccdb10d78a715a978c97b14a349c4bc69f
parent f81786b8ee67f4a7444c89bc2ac4c94076485361
Author: William Casarin <jb55@jb55.com>
Date:   Sun, 10 Dec 2023 19:16:22 -0800
rust: generate rust bindings from C header
We use bindgen to automatically generate our initial bindings. We still
need to build an idiomatic rust api, but this gets us started.
Diffstat:
5 files changed, 122 insertions(+), 4 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -24,3 +24,10 @@ libsecp256k1.a
 deps/
 testdata/db/*.mdb
 ndb
+
+src/bindings.rs
+
+# Added by cargo
+
+/target
+/Cargo.lock
diff --git a/Cargo.toml b/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "nostrdb"
+version = "0.1.0"
+edition = "2021"
+build = "build.rs"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[build-dependencies]
+bindgen = "0.69.1"
+cc = "1.0"
+
diff --git a/build.rs b/build.rs
@@ -0,0 +1,67 @@
+// build.rs
+use cc::Build;
+use std::env;
+use std::path::PathBuf;
+
+fn main() {
+    // Compile the C file
+    Build::new()
+        .files([
+            "nostrdb.c",
+            "sha256.c",
+            "bech32.c",
+            "deps/flatcc/src/runtime/json_parser.c",
+            "deps/flatcc/src/runtime/verifier.c",
+            "deps/flatcc/src/runtime/builder.c",
+            "deps/flatcc/src/runtime/emitter.c",
+            "deps/flatcc/src/runtime/refmap.c",
+            // Add all your C source files here
+            // For flatcc sources, you might want to iterate over an array of paths
+        ])
+        .include("deps/secp256k1/include")
+        .include("deps/lmdb")
+        .include("deps/flatcc/include")
+        // Add other include paths
+        //.flag("-Wall")
+        .flag("-Wno-misleading-indentation")
+        .flag("-Wno-unused-function")
+        .flag("-Werror")
+        .flag("-O2")
+        .flag("-g")
+        .compile("libnostrdb.a");
+
+    // Re-run the build script if any of the C files or headers change
+    for file in &[
+        "src/nostrdb.c",
+        "src/sha256.c",
+        "src/bech32.c",
+        // Add all your C source files here
+        "include/nostrdb.h",
+        "include/sha256.h",
+        // Add all your header files here
+    ] {
+        println!("cargo:rerun-if-changed={}", file);
+    }
+
+    println!("cargo:rustc-link-search=native=deps/lmdb");
+    println!("cargo:rustc-link-lib=static=lmdb");
+    println!("cargo:rustc-link-search=native=deps/secp256k1/.libs");
+    println!("cargo:rustc-link-lib=static=secp256k1");
+
+    // Print out the path to the compiled library
+    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
+    println!("cargo:rustc-link-search=native={}", out_path.display());
+    println!("cargo:rustc-link-lib=static=nostrdb");
+
+    // The bindgen::Builder is the main entry point to bindgen, and lets you build up options for
+    // the resulting bindings.
+    let bindings = bindgen::Builder::default()
+        .header("nostrdb.h")
+        .generate()
+        .expect("Unable to generate bindings");
+
+    // Write the bindings to the $OUT_DIR/bindings.rs file.
+    bindings
+        .write_to_file("src/bindings.rs")
+        .expect("Couldn't write bindings!");
+}
diff --git a/src/lib.rs b/src/lib.rs
@@ -0,0 +1,35 @@
+#[allow(non_upper_case_globals)]
+#[allow(non_camel_case_types)]
+#[allow(non_snake_case)]
+#[allow(unused)]
+mod bindings;
+
+use std::ffi::CString;
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use bindings as ndb;
+
+    #[test]
+    fn ndb_init_works() {
+        unsafe {
+            // Initialize ndb
+            let mut ndb_ptr: *mut bindings::ndb = std::ptr::null_mut();
+            let mut config = ndb::ndb_config {
+                filter_context: std::ptr::null_mut(),
+                ingest_filter: None,
+                flags: 0,
+                ingester_threads: 0,
+                mapsize: 0,
+            };
+
+            let path = CString::new(".").expect("Failed to create CString");
+            ndb::ndb_default_config(&mut config);
+            ndb::ndb_init(&mut ndb_ptr, path.as_ptr(), &mut config);
+
+            // Clean up
+            bindings::ndb_destroy(ndb_ptr);
+        }
+    }
+}
diff --git a/test.c b/test.c
@@ -956,10 +956,7 @@ static void test_fulltext()
 	assert(ndb_init(&ndb, test_dir, &config));
 
 	ndb_begin_query(ndb, &txn);
-	ndb_text_search(&txn, "Jump Over", &results, NULL);
-	fprintf(stderr, "num results %d\n", results.num_results);
-	assert(results.num_results == 1);
-	assert(!strncmp(results.results[0].key.str, "over", 4));
+	ndb_text_search(&txn, "Jump Over", &results, &search_config);
 	ndb_end_query(&txn);
 
 	ndb_destroy(ndb);