Create a new rust crate and make sure to specify crate-type to be "dylib".
Also add rutie
, rutie-serde
, serde
and possibly serde_derive
as a dependency.
[package]
edition = "2018"
[lib]
crate-type = ["dylib"]
name = "ruby_rust_demo"
[dependencies]
rutie = "0.8"
rutie-serde = "0.2"
serde = "1.0"
serde_derive = "1.0"
The usage is very similar to how you would use rutie
on it's own, but instead of calling
rutie_methods!
macro, you call rutie_serde_methods!
.
This macro takes care of deserializing arguments and serializing return values.
It also captures all panics inside those methods and raises them as an exception in ruby.
use rutie::{class, Class, Object};
use rutie_serde::{ruby_class, rutie_serde_methods};
use serde_derive::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
pub struct User {
pub name: String,
pub id: u64,
}
class!(HelloWorld);
rutie_serde_methods!(
HelloWorld,
_itself,
ruby_class!(Exception),
fn hello(name: String) -> String {
format!("Hello {}", name)
}
fn hello_user(user: User) -> String {
format!("Hello {:?}", user)
}
);
#[allow(non_snake_case)]
#[no_mangle]
pub extern "C" fn Init_ruby_rust_demo() {
let mut class = Class::new("RubyRustDemo", None);
class.define(|itself| itself.def_self("hello", hello));
class.define(|itself| itself.def_self("hello_user", hello_user));
}