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, callstranslator
andwrapper
modulestranslator
- 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