rutie-serde 0.1.0

rutie serde integration
docs.rs failed to build rutie-serde-0.1.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: rutie-serde-0.3.0

Usage example:

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.5.2"
rutie-serde = { path = "/Users/andriidmytrenko/dev/rust/rutie-serde" }
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, Object, class};
use rutie_serde::rutie_serde_methods;
use serde_derive::{Serialize, Deserialize};

#[derive(Debug, Deserialize)]
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) );
}