# ffigen

[![Build Status](https://travis-ci.org/vvanders/ffigen.svg?branch=master)](https://travis-ci.org/vvanders/ffigen)

Automatic generation of FFI bindings for calling Rust from other languages.

Note that this library is currently a work-in-progress and not yet ready for serious use.

# Overview

This library allows automatic code generation of the necessary stubs needed to call Rust via C FFI from other languages.
Using code generation and integration with build.rs you can be guaranteed that all function signatures are correct and that values are marshaled appropriately.

# Using

Any rust function that is marked:
```
#[no_mangle]  

pub extern ...
```

Will be exported as stubs to the appropriate language. Note that if you use String, &String or &str you will need to include "ffigen" module in your lib.rs/main.rs. This is for the appropriate string marshaling code.

Below is a template for build.rs that will auto-generate code when "cargo build" is invoked

```
extern crate ffigen;  
  
fn main() {  
    let mut context = ffigen::Context::new();  
  
    context.add_lang(ffigen::Lang::Cpp, &[ffigen::Config::Output("path_to_cpp_source".to_string())]);  
    ffigen::gen(&context);  
}
```

Adding the following line to your Cargo.toml will invoke the build script:
```
[package]
...
build="build.rs"
```

See lib.rs for all languages and config options.

More detailed getting started guide to follow.

# Supported Languages

Currently the following languages are supported:
* C\#
* C++ (dynamc only on win32)

with support for other languages at a future date.

# Unsupported values

Current ffi will not export the following parameter/return types:
* structs
* enums
* arrays
* pointers