ketos 0.12.0

Lisp dialect scripting and extension language
Documentation
extern crate ketos;
#[macro_use] extern crate ketos_derive;

use ketos::{FromValue, Interpreter};

#[derive(Clone, Debug, FromValueClone, ForeignValue, IntoValue, StructValue)]
struct Foo {
    name: String,
    value: i32,
}

#[derive(Clone, Debug, FromValueClone, ForeignValue, IntoValue, StructValue)]
struct Bar {
    name_with_underscore: String,
}

#[derive(Clone, Debug, FromValueClone, ForeignValue, IntoValue, StructValue)]
struct Baz {
    #[ketos(rename = "ketos-name")]
    rust_name: String,
}

#[derive(Clone, Debug, FromValueClone, ForeignValue, IntoValue, StructValue)]
struct Quux {
    foo: Foo,
    bar: Bar,
    baz: Baz,
}

#[test]
fn test_derive_struct() {
    let interp = Interpreter::new();

    interp.scope().register_struct_value::<Foo>();

    let v = interp.run_code(r#"
        (new Foo :name "hello" :value 123)
        "#, None).unwrap();

    let foo = Foo::from_value(v).unwrap();

    assert_eq!(foo.name, "hello");
    assert_eq!(foo.value, 123);
}

#[test]
fn test_derive_struct_name() {
    let interp = Interpreter::new();

    interp.scope().register_struct_value::<Bar>();

    let v = interp.run_code(r#"
        (new Bar :name-with-underscore "foo")
        "#, None).unwrap();

    let bar = Bar::from_value(v).unwrap();

    assert_eq!(bar.name_with_underscore, "foo");
}

#[test]
fn test_derive_struct_rename() {
    let interp = Interpreter::new();

    interp.scope().register_struct_value::<Baz>();

    let v = interp.run_code(r#"
        (new Baz :ketos-name "foo")
        "#, None).unwrap();

    let baz = Baz::from_value(v).unwrap();

    assert_eq!(baz.rust_name, "foo");
}

#[test]
fn test_derive_struct_in_struct() {
    let interp = Interpreter::new();

    interp.scope().register_struct_value::<Foo>();
    interp.scope().register_struct_value::<Bar>();
    interp.scope().register_struct_value::<Baz>();
    interp.scope().register_struct_value::<Quux>();

    let v = interp.run_code(r#"
        (new Quux
            :foo (new Foo :name "foo" :value 0)
            :bar (new Bar :name-with-underscore "bar")
            :baz (new Baz :ketos-name "baz"))
        "#, None).unwrap();

    let quux = Quux::from_value(v).unwrap();

    assert_eq!(quux.foo.name, "foo");
    assert_eq!(quux.bar.name_with_underscore, "bar");
    assert_eq!(quux.baz.rust_name, "baz");
}