Skip to content

sbag13/hi-ffi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

hi-ffi

Tool for generating bindings to Rust code.

How To Use

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.

Language specific examples:

The following examples are built on top of the Rust code defined here.

Supported Features

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

Development

Modules

hi_ffi contains of the following modules:

  • lib.rs - main module, creates target files and directories, calls translator and wrapper modules
  • translator - translates Rust code into parsed, intermediate representation; it is target language agnostic
  • wrapper - 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

TODO

  • pipelines
    • publishing to crates.io

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published