Struct gluon_vm::api::de::De[][src]

pub struct De<T>(pub T);
Expand description

Getable wrapper which extracts T by deserializing it into a rust value.

Struct

#[macro_use]
extern crate serde_derive;

#[macro_use]
extern crate gluon_vm;

use gluon::{Thread, ThreadExt, new_vm};
use gluon::base::types::ArcType;
use gluon::vm::api::VmType;
use gluon::vm::api::de::De;

#[derive(Debug, PartialEq, Deserialize)]
struct Vec2 {
    x: f64,
    y: f64
}

impl VmType for Vec2 {
    type Type = Self;

    fn make_type(thread: &Thread) -> ArcType {
        field_decl!{ x, y }
        type T = record_type! {
            x => f64,
            y => f64
        };
        T::make_type(thread)
    }
}


let thread = new_vm();

let (De(vec), _) = thread
    .run_expr::<De<Vec2>>("test", "{ x = 1.0, y = 2.0 }")
    .unwrap_or_else(|err| panic!("{}", err));
assert_eq!(vec, Vec2 {
        x: 1.0,
        y: 2.0
    });

Enum

#[macro_use]
extern crate serde_derive;

use gluon::{Thread, ThreadExt, new_vm};
use gluon::base::types::ArcType;
use gluon::vm::api::VmType;
use gluon::vm::api::de::De;

#[derive(Debug, PartialEq, Deserialize)]
enum Enum {
    A(i32),
    B { string: String, test: f64 },
}

impl VmType for Enum {
    type Type = Self;

    fn make_type(thread: &Thread) -> ArcType {
        // Use the enum type declared in gluon
        thread.find_type_info("test.Enum").unwrap().into_type()
    }
}


let thread = new_vm();

thread
    .load_script(
        "test",
        r#" type Enum = | A Int | B { string : String, test : Float } in { Enum } "#,
    )
    .unwrap_or_else(|err| panic!("{}", err));

let (De(enum_), _) = thread
    .run_expr::<De<Enum>>(
        "test",
        r#" let { Enum } = import! "test" in A 123 "#,
    )
    .unwrap_or_else(|err| panic!("{}", err));
assert_eq!(enum_, Enum::A(123));

// The field names of record variants are ignored so make sure the fields are declared correctly
let (De(enum_), _) = thread
    .run_expr::<De<Enum>>(
        "test",
        r#" let { Enum } = import! "test" in B { string = "abc", test = 3.14 } "#,
    )
    .unwrap_or_else(|err| panic!("{}", err));
assert_eq!(
    enum_,
    Enum::B {
        string: "abc".to_string(),
        test: 3.14,
    }
);

Tuple Fields

0: T

Trait Implementations

A version of Self which implements Any allowing a TypeId to be retrieved

Creates an gluon type which maps to Self in rust

How many extra arguments a function returning this type requires. Used for abstract types which when used in return position should act like they still need more arguments before they are called Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Extract a subset of the possible types in a coproduct (or get the remaining possibilities) Read more

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait. Read more

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait. Read more

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s. Read more

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s. Read more

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait. Read more

Performs the conversion.

Performs the conversion.

Performs the indexed conversion.

Consumes the current HList and returns an HList with the requested shape. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.