Expand description

This crate works with flapigen to provide an easy to use rust code with other programming languages

This crate uses procedural macros such as #generate_interface to locate methods and types for which interface code would be generated automatically Suppose you have the following Rust code:

struct Foo {
    data: i32
}

impl Foo {
    fn new(val: i32) -> Foo {
        Foo{data: val}
    }

    fn f(&self, a: i32, b: i32) -> i32 {
        self.data + a + b
    }

    ///Custom doc comment
    fn set_field(&mut self, v: i32) {
        self.data = v;
    }
}

Using flapigen, you need to generate an interface file with contents:

foreign_class!(class Foo {
    self_type Foo;
    constructor Foo::new(_: i32) -> Foo;
    ///Custom doc comment
    fn Foo::set_field(&mut self, _: i32);
    fn Foo::f(&self, _: i32, _: i32) -> i32;
});

Using this crate, you can simply annotate the methods using either #[generate_interface], #[generate_interface(constructor)] or #[generate_interface_doc]

First add the appropriate dependencies

In Cargo.toml

[dependencies]
rifgen = "*"
[build-dependencies]
rifgen = "*"

In build.rs

 //place this code before flapigen swig_expand function
 use rifgen::{Generator, TypeCases, Language};
 let source_folder = "/user/projects"; //use your projects folder
 let out_file = "/user/projects/glue.in";
 Generator::new(TypeCases::CamelCase,Language::Java,source_folder)
 .generate_interface(out_file)

Using the example above, the modified code would be

use rifgen::rifgen_attr::*;

struct Foo {
    data: i32
}

impl Foo {
    #[generate_interface(constructor)]
    fn new(val: i32) -> Foo {
        Foo{data: val}
    }
    #[generate_interface]
    fn f(&self, a: i32, b: i32) -> i32 {
        self.data + a + b
    }

    ///Custom doc comment
    #[generate_interface]
    fn set_field(&mut self, v: i32) {
        self.data = v;
    }
}

This crate works with doc comments so all doc comments would be preserved Use #[generate_interface_doc] on structs only to preserve the doc comment of the struct

///Data holder
#[generate_interface_doc]
struct Foo {
    data: i32
}

For trait just annotate the trait definition

///MyCallback documentation
#[generate_interface]
trait MyCallback {
    
    fn on_click(&self) {
    }
}

For enum, it’s similar to trait

#[generate_interface]
enum MyEnum {
    One,
    Two
}

Re-exports

pub extern crate rifgen_attr;

Structs

The builder to use in build.rs file to generate the interface file

Enums

Supported languages for now
The various type cases to use when generating interface files i.e CamelCase or snake_case or just leave the style unchanged