Tool for generating bindings to Rust code.
Rust glue code and bindings in target languages are generated for Rust code that is marked with the #[ffi] macro.
use hi_ffi::ffi;
#[ffi]
#[derive(Default, Clone)]
struct TestStruct {
// generate getter and setter
#[ffi(setter, getter)]
i32_field: i32,
// generate getter only
#[ffi(getter)]
bool_field: bool,
// generate getter and setter
pub string_field: String,
// don't generate getter and setter
#[ffi(skip)]
_skip_field: i32,
#[ffi(getter, setter)]
struct_field: TestStruct2,
}
#[ffi]
#[derive(Default, Clone)]
struct TestStruct2 {
pub i32_field: i32,
}
#[ffi]
fn function_with_primitive_and_string_arg(_i: i32, _b: bool, _s: String) {}After building Rust package, the FFI code is generated in generated_code directory, which then can be embedded into a program written in one of target languages.
The following examples are built on top of the Rust code defined here.
- C++:
- Swift
| c++ | swift | ||
|---|---|---|---|
| structs | primitive setters | ✅ | ✅ |
| primitive getters | ✅ | ✅ | |
| string setters | ✅ | ✅ | |
| string getters | ✅ | ✅ | |
| struct getters | ✅ | ❌ | |
| struct setters | ✅ | ❌ | |
| default constructor | ✅ | ✅ | |
| methods | primitive arguments | ✅ | ✅ |
| string arguments | ✅ | ✅ | |
| primitive return | ✅ | ✅ | |
| string return | ✅ | ✅ | |
| struct arguments | ❌ | ❌ | |
| struct return | ❌ | ❌ | |
| static methods | primitive arguments | ✅ | ✅ |
| string arguments | ✅ | ✅ | |
| primitive return | ✅ | ✅ | |
| string return | ✅ | ✅ | |
| struct arguments | ❌ | ❌ | |
| struct return | ❌ | ❌ | |
| functions | primitive arguments | ✅ | ✅ |
| string arguments | ✅ | ✅ | |
| primitive return | ✅ | ✅ | |
| string return | ✅ | ✅ | |
| str return | ❌ | ❌ | |
| struct arguments | ❌ | ❌ | |
| struct return | ❌ | ❌ | |
| enums | primitive enums | ❌ | ❌ |
| variants with primitives | ❌ | ❌ | |
| variants with strings | ❌ | ❌ | |
| variants with structs | ❌ | ❌ | |
| vector | primitives vector | ❌ | ❌ |
| strings vector | ❌ | ❌ |
hi_ffi contains of the following modules:
lib.rs- main module, creates target files and directories, callstranslatorandwrappermodulestranslator- translates Rust code into parsed, intermediate representation; it is target language agnosticwrapper- result of translation. it is used for generating Rust glue code (Into<TokenStream>) and bindings for every target language- language specific base modules (
cpp,swift) - generates base code for each target language
- pipelines
- publishing to crates.io