[][src]Macro ocaml_interop::ocaml_unpack_polymorphic_variant

macro_rules! ocaml_unpack_polymorphic_variant {
    ($self:ident => {
        $($tag:ident $(($($slot_name:ident: $slot_typ:ty),+ $(,)?))? => $conv:expr),+ $(,)?
    }) => { ... };
}

Unpacks an OCaml polymorphic variant and maps it into a Rust enum.

Note

Unlike with ocaml_unpack_record!, the result of ocaml_unpack_polymorphic_variant! is a Result value. An error will be returned in the case of an unexpected tag value. This may change in the future.

Examples

enum Movement {
    StepLeft,
    StepRight,
    Rotate(f64),
}

// Assuming an OCaml type declaration like:
//
//      type movement = [
//        | `StepLeft
//        | `StepRight
//        | `Rotate of float
//      ]

let ocaml_polymorphic_variant = make_ocaml_polymorphic_movement(cr, &OCaml::unit());
let result = ocaml_unpack_polymorphic_variant! {
    ocaml_polymorphic_variant => {
        StepLeft  => Movement::StepLeft,
        StepRight => Movement::StepRight,
        // Tag field names are mandatory
        Rotate(rotation: OCamlFloat)
                  => Movement::Rotate(rotation),
    }
}.unwrap();
// ...