[][src]Macro itsy::extern_rust

macro_rules! extern_rust {
    (@enum $enum_name:ident $(, $name:tt [ $( $attr:meta ),* ] )* ) => { ... };
    (@handle-ret $vm:ident, u8, $value:ident) => { ... };
    (@handle-ret $vm:ident, u16, $value:ident) => { ... };
    (@handle-ret $vm:ident, u32, $value:ident) => { ... };
    (@handle-ret $vm:ident, u64, $value:ident) => { ... };
    (@handle-ret $vm:ident, i8, $value:ident) => { ... };
    (@handle-ret $vm:ident, i16, $value:ident) => { ... };
    (@handle-ret $vm:ident, i32, $value:ident) => { ... };
    (@handle-ret $vm:ident, i64, $value:ident) => { ... };
    (@handle-ret $vm:ident, f32, $value:ident) => { ... };
    (@handle-ret $vm:ident, f64, $value:ident) => { ... };
    (@handle-ret $vm:ident, bool, $value:ident) => { ... };
    (@handle-ret $vm:ident, $_:tt, $value:ident) => { ... };
    (@handle-param $vm:ident, u8) => { ... };
    (@handle-param $vm:ident, u16) => { ... };
    (@handle-param $vm:ident, u32) => { ... };
    (@handle-param $vm:ident, u64) => { ... };
    (@handle-param $vm:ident, i8) => { ... };
    (@handle-param $vm:ident, i16) => { ... };
    (@handle-param $vm:ident, i32) => { ... };
    (@handle-param $vm:ident, i64) => { ... };
    (@handle-param $vm:ident, f32) => { ... };
    (@handle-param $vm:ident, f64) => { ... };
    (@handle-param $vm:ident, bool) => { ... };
    (@handle-param $vm:ident, & str) => { ... };
    (@handle-param $vm:ident, & $_:tt) => { ... };
    (@handle-param $vm:ident, $_:tt) => { ... };
    (@trait $enum_name:ident, $custom_type:ty $(, $name:tt, $vm:ident [ $( $arg_name:ident : $($arg_type:tt)+ ),* ] [ $($ret_type:ident)? ] $code:block )* ) => { ... };
    (
        $enum_name:ident, $custom_type:ty, { $(
            $( #[ $attr:meta ] )*
            fn $name:tt ( $vm:ident : & mut VM $(, $arg_name:ident : $($arg_type:tt)+ )* ) $( -> $ret_type:ident )? $code:block // ret_type cannot be ty as that can't be matched by handle-ret-val (macro shortcoming), or tt as that is ambiguous with $code. We'll just accept simple return types for now.
        )* }
    ) => { ... };
}

Generates a type implementing VMFunc and VMData.

Example:

The following code makes the two Rust functions print(i32) and hello_world() available to Itsy code compiled with vm::<MyFns>(...).

extern_rust!(MyFns, (), {
    /// prints given i32 value
    fn print(vm: &mut VM, value: i32) {
        println!("print:{}", value);
    }
    /// prints hello world!
    fn hello_world(vm: &mut VM) {
        println!("hello world!");
    }
});