app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 62788649fa9fa01457939024f0d7c41d7bdd5ed5
parent 04a101be3ab5c0443b006dfeb4c6bf8a169352a4
Author: triesap <tyson@radroots.org>
Date:   Sun,  9 Aug 2026 19:00:15 +0000

ffi: rename HarvestCircle native crates

- move the UniFFI producer and generator to HarvestCircle crate names
- rename native libraries, Cargo selectors, configuration, and digest inputs
- refresh the Kotlin compatibility digest for the renamed producer
- verify generated bindings and release libraries in both build lanes

Diffstat:
Mapp/desktop/build.gradle.kts | 22+++++++++++-----------
Mapp/desktop/src/main/kotlin/org/radroots/studio/application/NativeCompatibility.kt | 2+-
Mcore/Cargo.lock | 56++++++++++++++++++++++++++++----------------------------
Mcore/Cargo.toml | 8++++----
Acore/crates/harvestcircle_ffi/Cargo.toml | 40++++++++++++++++++++++++++++++++++++++++
Acore/crates/harvestcircle_ffi/build.rs | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rcore/crates/studio_ffi/src/commands.rs -> core/crates/harvestcircle_ffi/src/commands.rs | 0
Acore/crates/harvestcircle_ffi/src/contract.rs | 9+++++++++
Rcore/crates/studio_ffi/src/dto.rs -> core/crates/harvestcircle_ffi/src/dto.rs | 0
Rcore/crates/studio_ffi/src/lib.rs -> core/crates/harvestcircle_ffi/src/lib.rs | 0
Rcore/crates/studio_ffi/src/observer.rs -> core/crates/harvestcircle_ffi/src/observer.rs | 0
Acore/crates/harvestcircle_ffi/uniffi.toml | 3+++
Acore/crates/harvestcircle_uniffi_bindgen/Cargo.toml | 18++++++++++++++++++
Rcore/crates/studio_uniffi_bindgen/src/main.rs -> core/crates/harvestcircle_uniffi_bindgen/src/main.rs | 0
Dcore/crates/studio_ffi/Cargo.toml | 40----------------------------------------
Dcore/crates/studio_ffi/build.rs | 95-------------------------------------------------------------------------------
Dcore/crates/studio_ffi/src/contract.rs | 9---------
Dcore/crates/studio_ffi/uniffi.toml | 3---
Dcore/crates/studio_uniffi_bindgen/Cargo.toml | 18------------------
19 files changed, 209 insertions(+), 209 deletions(-)

diff --git a/app/desktop/build.gradle.kts b/app/desktop/build.gradle.kts @@ -155,17 +155,17 @@ fun resolveNativeTarget( val arch = architecture.lowercase() return when { os.startsWith("mac") && arch in setOf("aarch64", "arm64") -> - NativeTarget("libradroots_studio_ffi.dylib", "darwin-aarch64") + NativeTarget("libharvestcircle_ffi.dylib", "darwin-aarch64") os.startsWith("mac") && arch in setOf("x86_64", "amd64") -> - NativeTarget("libradroots_studio_ffi.dylib", "darwin-x86-64") + NativeTarget("libharvestcircle_ffi.dylib", "darwin-x86-64") os.startsWith("windows") && arch in setOf("aarch64", "arm64") -> - NativeTarget("radroots_studio_ffi.dll", "win32-aarch64") + NativeTarget("harvestcircle_ffi.dll", "win32-aarch64") os.startsWith("windows") && arch in setOf("x86_64", "amd64") -> - NativeTarget("radroots_studio_ffi.dll", "win32-x86-64") + NativeTarget("harvestcircle_ffi.dll", "win32-x86-64") os.startsWith("linux") && arch in setOf("aarch64", "arm64") -> - NativeTarget("libradroots_studio_ffi.so", "linux-aarch64") + NativeTarget("libharvestcircle_ffi.so", "linux-aarch64") os.startsWith("linux") && arch in setOf("x86_64", "amd64") -> - NativeTarget("libradroots_studio_ffi.so", "linux-x86-64") + NativeTarget("libharvestcircle_ffi.so", "linux-x86-64") else -> throw GradleException("Unsupported native desktop host: $osName/$architecture") } } @@ -189,7 +189,7 @@ val buildRustCoreDebug by tasks.registering(Exec::class) { "--manifest-path", rustManifest.absolutePath, "-p", - "radroots_studio_ffi", + "harvestcircle_ffi", *immutableCargoArguments.toTypedArray(), ) inputs.files(rustSources) @@ -205,7 +205,7 @@ val buildRustCoreRelease by tasks.registering(Exec::class) { "--manifest-path", rustManifest.absolutePath, "-p", - "radroots_studio_ffi", + "harvestcircle_ffi", *immutableCargoArguments.toTypedArray(), ) inputs.files(rustSources) @@ -226,7 +226,7 @@ val generateUniFfiKotlin by tasks.registering(Exec::class) { "--manifest-path", rustManifest.absolutePath, "-p", - "radroots_studio_uniffi_bindgen", + "harvestcircle_uniffi_bindgen", *immutableCargoArguments.toTypedArray(), "--", "generate", @@ -236,13 +236,13 @@ val generateUniFfiKotlin by tasks.registering(Exec::class) { "--metadata-no-deps", "--no-format", "--config", - rustCoreSource.resolve("crates/studio_ffi/uniffi.toml").absolutePath, + rustCoreSource.resolve("crates/harvestcircle_ffi/uniffi.toml").absolutePath, "--out-dir", generatedUniFfiKotlin.get().asFile.absolutePath, rustDebugLibrary.absolutePath, ) inputs.file(rustDebugLibrary) - inputs.file(rustCoreSource.resolve("crates/studio_ffi/uniffi.toml")) + inputs.file(rustCoreSource.resolve("crates/harvestcircle_ffi/uniffi.toml")) outputs.dir(generatedUniFfiKotlin) } diff --git a/app/desktop/src/main/kotlin/org/radroots/studio/application/NativeCompatibility.kt b/app/desktop/src/main/kotlin/org/radroots/studio/application/NativeCompatibility.kt @@ -5,7 +5,7 @@ import org.radroots.studio.ffi.CompatibilityExpectation internal const val EXPECTED_PRODUCT_VERSION = "0.1.0-alpha" internal const val EXPECTED_CARGO_PACKAGE_VERSION = "0.1.0-alpha" -internal const val EXPECTED_FFI_CONTRACT_HASH = "6804ed2b522cb033bf085d94cd4f9a358a60bd48fb52e73f7a308624eb85ab05" +internal const val EXPECTED_FFI_CONTRACT_HASH = "249b8f9ec8ce64e33d5b88dd52d7dc646a2d5b6993c738e71253964531d6d210" internal val EXPECTED_FFI_CONTRACT_MAJOR: UShort = 3.toUShort() internal val MINIMUM_FFI_CONTRACT_MINOR: UShort = 0.toUShort() internal const val MINIMUM_STORAGE_SCHEMA: UInt = 5U diff --git a/core/Cargo.lock b/core/Cargo.lock @@ -1083,6 +1083,27 @@ dependencies = [ ] [[package]] +name = "harvestcircle_ffi" +version = "0.1.0-alpha" +dependencies = [ + "directories", + "harvestcircle_application", + "harvestcircle_domain", + "harvestcircle_nostr", + "harvestcircle_runtime", + "harvestcircle_storage", + "nostr 0.44.1", + "nostr-relay-builder", + "nostr-sdk 0.44.0", + "quote", + "sha2", + "syn 2.0.119", + "tempfile", + "tokio", + "uniffi", +] + +[[package]] name = "harvestcircle_nostr" version = "0.1.0-alpha" dependencies = [ @@ -1139,6 +1160,13 @@ dependencies = [ ] [[package]] +name = "harvestcircle_uniffi_bindgen" +version = "0.1.0-alpha" +dependencies = [ + "uniffi", +] + +[[package]] name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2078,34 +2106,6 @@ dependencies = [ ] [[package]] -name = "radroots_studio_ffi" -version = "0.1.0-alpha" -dependencies = [ - "directories", - "harvestcircle_application", - "harvestcircle_domain", - "harvestcircle_nostr", - "harvestcircle_runtime", - "harvestcircle_storage", - "nostr 0.44.1", - "nostr-relay-builder", - "nostr-sdk 0.44.0", - "quote", - "sha2", - "syn 2.0.119", - "tempfile", - "tokio", - "uniffi", -] - -[[package]] -name = "radroots_studio_uniffi_bindgen" -version = "0.1.0-alpha" -dependencies = [ - "uniffi", -] - -[[package]] name = "radroots_transport" version = "0.1.0-alpha" source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" diff --git a/core/Cargo.toml b/core/Cargo.toml @@ -2,12 +2,12 @@ members = [ "crates/harvestcircle_application", "crates/harvestcircle_domain", - "crates/studio_ffi", + "crates/harvestcircle_ffi", "crates/harvestcircle_nostr", "crates/harvestcircle_preferences", "crates/harvestcircle_runtime", "crates/harvestcircle_storage", - "crates/studio_uniffi_bindgen", + "crates/harvestcircle_uniffi_bindgen", ] resolver = "3" @@ -35,12 +35,12 @@ unimplemented = "deny" [workspace.dependencies] harvestcircle_application = { path = "crates/harvestcircle_application", version = "=0.1.0-alpha" } harvestcircle_domain = { path = "crates/harvestcircle_domain", version = "=0.1.0-alpha" } -radroots_studio_ffi = { path = "crates/studio_ffi", version = "=0.1.0-alpha" } +harvestcircle_ffi = { path = "crates/harvestcircle_ffi", version = "=0.1.0-alpha" } harvestcircle_nostr = { path = "crates/harvestcircle_nostr", version = "=0.1.0-alpha" } harvestcircle_preferences = { path = "crates/harvestcircle_preferences", version = "=0.1.0-alpha" } harvestcircle_runtime = { path = "crates/harvestcircle_runtime", version = "=0.1.0-alpha" } harvestcircle_storage = { path = "crates/harvestcircle_storage", version = "=0.1.0-alpha" } -radroots_studio_uniffi_bindgen = { path = "crates/studio_uniffi_bindgen", version = "=0.1.0-alpha" } +harvestcircle_uniffi_bindgen = { path = "crates/harvestcircle_uniffi_bindgen", version = "=0.1.0-alpha" } radroots_identity = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha", default-features = false } radroots_transport = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha", default-features = false } radroots_transport_nostr = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha", default-features = false } diff --git a/core/crates/harvestcircle_ffi/Cargo.toml b/core/crates/harvestcircle_ffi/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "harvestcircle_ffi" +description = "Private native FFI boundary for HarvestCircle" +version = "0.1.0-alpha" +edition.workspace = true +authors.workspace = true +rust-version.workspace = true +license = "GPL-3.0-only" +repository.workspace = true +homepage.workspace = true +publish = false +build = "build.rs" +include = ["build.rs", "src/**", "uniffi.toml", "Cargo.toml"] + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +directories = "=6.0.0" +harvestcircle_application.workspace = true +harvestcircle_domain.workspace = true +harvestcircle_nostr.workspace = true +harvestcircle_runtime.workspace = true +harvestcircle_storage.workspace = true +tokio = { version = "=1.47.1", features = ["macros", "rt-multi-thread", "sync", "time"] } +uniffi = "=0.32.0" + +[build-dependencies] +quote.workspace = true +sha2.workspace = true +syn.workspace = true + +[dev-dependencies] +nostr = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219", package = "nostr" } +nostr-relay-builder = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219", package = "nostr-relay-builder" } +nostr-sdk = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219", package = "nostr-sdk" } +tempfile = "=3.23.0" + +[lints] +workspace = true diff --git a/core/crates/harvestcircle_ffi/build.rs b/core/crates/harvestcircle_ffi/build.rs @@ -0,0 +1,95 @@ +use std::fs; +use std::path::{Path, PathBuf}; + +use quote::ToTokens; +use sha2::{Digest, Sha256}; +use syn::{ImplItem, Item, Visibility}; + +const CONTRACT_SOURCES: &[&str] = &[ + "src/commands.rs", + "src/contract.rs", + "src/dto.rs", + "src/lib.rs", + "src/observer.rs", +]; + +fn main() { + for source in CONTRACT_SOURCES { + println!("cargo:rerun-if-changed={source}"); + } + println!("cargo:rerun-if-changed=../harvestcircle_storage/migrations"); + + let mut metadata = Vec::new(); + for source in CONTRACT_SOURCES { + collect_public_metadata(Path::new(source), &mut metadata); + } + let mut migrations = fs::read_dir("../harvestcircle_storage/migrations") + .expect("read Studio migration catalog") + .map(|entry| entry.expect("read migration entry").path()) + .filter(|path| path.extension().is_some_and(|extension| extension == "sql")) + .collect::<Vec<_>>(); + migrations.sort(); + for migration in migrations { + metadata.push(format!( + "migration:{}:{}", + migration + .file_name() + .expect("migration filename") + .to_string_lossy(), + hex_digest(&fs::read(&migration).expect("read migration")) + )); + } + metadata.sort(); + metadata.dedup(); + let normalized = metadata.join("\n"); + println!( + "cargo:rustc-env=HARVESTCIRCLE_FFI_CONTRACT_DIGEST={}", + hex_digest(normalized.as_bytes()) + ); + fs::write( + PathBuf::from(std::env::var_os("OUT_DIR").expect("OUT_DIR")) + .join("ffi_contract_metadata.txt"), + normalized, + ) + .expect("write normalized FFI metadata"); +} + +fn collect_public_metadata(path: &Path, output: &mut Vec<String>) { + let source = fs::read_to_string(path).expect("read FFI source"); + let file = syn::parse_file(&source).expect("parse FFI source"); + for item in file.items { + match item { + Item::Const(item) if is_public(&item.vis) => push_tokens("const", item, output), + Item::Enum(item) if is_public(&item.vis) => push_tokens("enum", item, output), + Item::Fn(item) if is_public(&item.vis) => push_tokens("fn", item.sig, output), + Item::Struct(item) if is_public(&item.vis) => push_tokens("struct", item, output), + Item::Trait(item) if is_public(&item.vis) => push_tokens("trait", item, output), + Item::Impl(item) => { + let owner = item.self_ty.to_token_stream().to_string(); + for member in item.items { + if let ImplItem::Fn(function) = member + && is_public(&function.vis) + { + output.push(format!("method:{owner}:{}", function.sig.to_token_stream())); + } + } + } + _ => {} + } + } +} + +fn push_tokens(kind: &str, value: impl ToTokens, output: &mut Vec<String>) { + output.push(format!("{kind}:{}", value.to_token_stream())); +} + +const fn is_public(visibility: &Visibility) -> bool { + matches!(visibility, Visibility::Public(_)) +} + +fn hex_digest(bytes: &[u8]) -> String { + Sha256::digest(bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} diff --git a/core/crates/studio_ffi/src/commands.rs b/core/crates/harvestcircle_ffi/src/commands.rs diff --git a/core/crates/harvestcircle_ffi/src/contract.rs b/core/crates/harvestcircle_ffi/src/contract.rs @@ -0,0 +1,9 @@ +pub const PRODUCT_VERSION: &str = "0.1.0-alpha"; +pub const FFI_CONTRACT_MAJOR: u16 = 3; +pub const FFI_CONTRACT_MINOR: u16 = 0; +pub const MINIMUM_SCHEMA_VERSION: u32 = 5; +pub const FFI_CONTRACT_HASH: &str = env!("HARVESTCIRCLE_FFI_CONTRACT_DIGEST"); + +#[cfg(test)] +pub(crate) const NORMALIZED_CONTRACT_METADATA: &str = + include_str!(concat!(env!("OUT_DIR"), "/ffi_contract_metadata.txt")); diff --git a/core/crates/studio_ffi/src/dto.rs b/core/crates/harvestcircle_ffi/src/dto.rs diff --git a/core/crates/studio_ffi/src/lib.rs b/core/crates/harvestcircle_ffi/src/lib.rs diff --git a/core/crates/studio_ffi/src/observer.rs b/core/crates/harvestcircle_ffi/src/observer.rs diff --git a/core/crates/harvestcircle_ffi/uniffi.toml b/core/crates/harvestcircle_ffi/uniffi.toml @@ -0,0 +1,3 @@ +[crates.harvestcircle_ffi.bindings.kotlin] +package_name = "org.radroots.studio.ffi" +cdylib_name = "harvestcircle_ffi" diff --git a/core/crates/harvestcircle_uniffi_bindgen/Cargo.toml b/core/crates/harvestcircle_uniffi_bindgen/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "harvestcircle_uniffi_bindgen" +description = "Private UniFFI binding generator for HarvestCircle" +version = "0.1.0-alpha" +edition.workspace = true +authors.workspace = true +rust-version.workspace = true +license = "GPL-3.0-only" +repository.workspace = true +homepage.workspace = true +publish = false +include = ["src/**", "Cargo.toml"] + +[dependencies] +uniffi = { version = "=0.32.0", features = ["cli"] } + +[lints] +workspace = true diff --git a/core/crates/studio_uniffi_bindgen/src/main.rs b/core/crates/harvestcircle_uniffi_bindgen/src/main.rs diff --git a/core/crates/studio_ffi/Cargo.toml b/core/crates/studio_ffi/Cargo.toml @@ -1,40 +0,0 @@ -[package] -name = "radroots_studio_ffi" -description = "Private native FFI boundary for HarvestCircle" -version = "0.1.0-alpha" -edition.workspace = true -authors.workspace = true -rust-version.workspace = true -license = "GPL-3.0-only" -repository.workspace = true -homepage.workspace = true -publish = false -build = "build.rs" -include = ["build.rs", "src/**", "uniffi.toml", "Cargo.toml"] - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -directories = "=6.0.0" -harvestcircle_application.workspace = true -harvestcircle_domain.workspace = true -harvestcircle_nostr.workspace = true -harvestcircle_runtime.workspace = true -harvestcircle_storage.workspace = true -tokio = { version = "=1.47.1", features = ["macros", "rt-multi-thread", "sync", "time"] } -uniffi = "=0.32.0" - -[build-dependencies] -quote.workspace = true -sha2.workspace = true -syn.workspace = true - -[dev-dependencies] -nostr = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219", package = "nostr" } -nostr-relay-builder = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219", package = "nostr-relay-builder" } -nostr-sdk = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219", package = "nostr-sdk" } -tempfile = "=3.23.0" - -[lints] -workspace = true diff --git a/core/crates/studio_ffi/build.rs b/core/crates/studio_ffi/build.rs @@ -1,95 +0,0 @@ -use std::fs; -use std::path::{Path, PathBuf}; - -use quote::ToTokens; -use sha2::{Digest, Sha256}; -use syn::{ImplItem, Item, Visibility}; - -const CONTRACT_SOURCES: &[&str] = &[ - "src/commands.rs", - "src/contract.rs", - "src/dto.rs", - "src/lib.rs", - "src/observer.rs", -]; - -fn main() { - for source in CONTRACT_SOURCES { - println!("cargo:rerun-if-changed={source}"); - } - println!("cargo:rerun-if-changed=../harvestcircle_storage/migrations"); - - let mut metadata = Vec::new(); - for source in CONTRACT_SOURCES { - collect_public_metadata(Path::new(source), &mut metadata); - } - let mut migrations = fs::read_dir("../harvestcircle_storage/migrations") - .expect("read Studio migration catalog") - .map(|entry| entry.expect("read migration entry").path()) - .filter(|path| path.extension().is_some_and(|extension| extension == "sql")) - .collect::<Vec<_>>(); - migrations.sort(); - for migration in migrations { - metadata.push(format!( - "migration:{}:{}", - migration - .file_name() - .expect("migration filename") - .to_string_lossy(), - hex_digest(&fs::read(&migration).expect("read migration")) - )); - } - metadata.sort(); - metadata.dedup(); - let normalized = metadata.join("\n"); - println!( - "cargo:rustc-env=RADROOTS_STUDIO_FFI_CONTRACT_DIGEST={}", - hex_digest(normalized.as_bytes()) - ); - fs::write( - PathBuf::from(std::env::var_os("OUT_DIR").expect("OUT_DIR")) - .join("ffi_contract_metadata.txt"), - normalized, - ) - .expect("write normalized FFI metadata"); -} - -fn collect_public_metadata(path: &Path, output: &mut Vec<String>) { - let source = fs::read_to_string(path).expect("read FFI source"); - let file = syn::parse_file(&source).expect("parse FFI source"); - for item in file.items { - match item { - Item::Const(item) if is_public(&item.vis) => push_tokens("const", item, output), - Item::Enum(item) if is_public(&item.vis) => push_tokens("enum", item, output), - Item::Fn(item) if is_public(&item.vis) => push_tokens("fn", item.sig, output), - Item::Struct(item) if is_public(&item.vis) => push_tokens("struct", item, output), - Item::Trait(item) if is_public(&item.vis) => push_tokens("trait", item, output), - Item::Impl(item) => { - let owner = item.self_ty.to_token_stream().to_string(); - for member in item.items { - if let ImplItem::Fn(function) = member - && is_public(&function.vis) - { - output.push(format!("method:{owner}:{}", function.sig.to_token_stream())); - } - } - } - _ => {} - } - } -} - -fn push_tokens(kind: &str, value: impl ToTokens, output: &mut Vec<String>) { - output.push(format!("{kind}:{}", value.to_token_stream())); -} - -const fn is_public(visibility: &Visibility) -> bool { - matches!(visibility, Visibility::Public(_)) -} - -fn hex_digest(bytes: &[u8]) -> String { - Sha256::digest(bytes) - .iter() - .map(|byte| format!("{byte:02x}")) - .collect() -} diff --git a/core/crates/studio_ffi/src/contract.rs b/core/crates/studio_ffi/src/contract.rs @@ -1,9 +0,0 @@ -pub const PRODUCT_VERSION: &str = "0.1.0-alpha"; -pub const FFI_CONTRACT_MAJOR: u16 = 3; -pub const FFI_CONTRACT_MINOR: u16 = 0; -pub const MINIMUM_SCHEMA_VERSION: u32 = 5; -pub const FFI_CONTRACT_HASH: &str = env!("RADROOTS_STUDIO_FFI_CONTRACT_DIGEST"); - -#[cfg(test)] -pub(crate) const NORMALIZED_CONTRACT_METADATA: &str = - include_str!(concat!(env!("OUT_DIR"), "/ffi_contract_metadata.txt")); diff --git a/core/crates/studio_ffi/uniffi.toml b/core/crates/studio_ffi/uniffi.toml @@ -1,3 +0,0 @@ -[crates.radroots_studio_ffi.bindings.kotlin] -package_name = "org.radroots.studio.ffi" -cdylib_name = "radroots_studio_ffi" diff --git a/core/crates/studio_uniffi_bindgen/Cargo.toml b/core/crates/studio_uniffi_bindgen/Cargo.toml @@ -1,18 +0,0 @@ -[package] -name = "radroots_studio_uniffi_bindgen" -description = "Private UniFFI binding generator for HarvestCircle" -version = "0.1.0-alpha" -edition.workspace = true -authors.workspace = true -rust-version.workspace = true -license = "GPL-3.0-only" -repository.workspace = true -homepage.workspace = true -publish = false -include = ["src/**", "Cargo.toml"] - -[dependencies] -uniffi = { version = "=0.32.0", features = ["cli"] } - -[lints] -workspace = true