[][src]Crate gluon_codegen

Various macros for integrating with the gluon vm.

Derive Macros

Custom derives for the following gluon-Traits are available:

Getable

Derives Getable for any enum or struct as long as all fields also implement Getable (generic type parameters included). If the type is generic over a lifetime, the lifetime will be constrained to that of the 'vm lifetime in the trait definition.

Note: Newtype structs are expected to be their inner type on the Gluon side.

Examples

Marhalling this gluon type:

type Comment =
    | Normal String
    | Multiline String
    | Doc String

To this rust enum:

#[macro_use]
extern crate gluon_codegen;
extern crate gluon;

enum Comment {
    Normal(String),
    Multiline(String),
    Doc(String),
}

Pushable

Derives Pushable for any enum or struct as long as all fields also implement Pushable (generic type parameters included).

Note: Newtype structs are pushed as their inner type.

Examples

Allowing the User struct to be marshalled to gluon code:

#[macro_use]
extern crate gluon_codegen;
extern crate gluon;

#[derive(Pushable)]
struct User {
    name: String,
    age: u32,
}

As this compatible Record:

type User = { name: String, age: Int }

VmType

Derives VmType for a rust type, mapping it to a gluon type.

Alternatively, you can specify the corresponding gluon type with the #[gluon(vm_type = "<gluon_type>")] attribute, where the gluon type is the fully qualified type name. The gluon type must be registered before a binding using the mapped rust type is first loaded.

If the rust type has type parameters, they have to implement VmType as well. All lifetimes have to be 'static.

Note: Newtype structs are mapped to their inner type.

Examples

Deriving VmType for a struct:

#[macro_use]
extern crate gluon_codegen;
extern crate gluon;

// will map to: `{ string: String, number: Int, vec: Array Float }`
#[derive(VmType)]
struct Struct {
    string: String,
    number: u32,
    vec: Vec<f64>,
}

Mapping to an existing type, assuming the following gluon type in the module types:

type Either l r = | Left l | Right r

Requires the additional vm_type attribute:

#[macro_use]
extern crate gluon_codegen;
extern crate gluon;

#[derive(VmType)]
#[gluon(vm_type = "types.Either")]
enum Either<L, R> {
    Left(L),
    Right(R),
}

Userdata

Derives Userdata and the required Trace and VmType for a rust type. Note that you will still have to use Thread::register_type to register the rust type with the vm before it is used.

Examples

Deriving Userdata for a type that will be opaque for the gluon code:

#[macro_use]
extern crate gluon_codegen;
extern crate gluon;

use std::sync::Arc;

// Userdata requires Trace + Debug + Send + Sync
#[derive(Userdata, Trace, Debug)]
struct Ident {
    group: Arc<str>,
    name: Arc<str>,
}