Macro ocaml_interop::ocaml_unpack_variant [−][src]
macro_rules! ocaml_unpack_variant { ($self:ident => { $($($tag:ident)::+ $(($($slot_name:ident: $slot_typ:ty),+ $(,)?))? $(=> $conv:expr)?),+ $(,)? }) => { ... }; ($self:ident => { $($($tag:ident)::+ $({$($slot_name:ident: $slot_typ:ty),+ $(,)?})? $(=> $conv:expr)?),+ $(,)? }) => { ... }; }
Expand description
Unpacks an OCaml variant and maps it into a Rust enum.
This macro works on OCaml
<'gc, T>
values.
It is important that the order of the fields remains the same as in the OCaml type declaration.
Note
Unlike with ocaml_unpack_record!
, the result of ocaml_unpack_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 // // NOTE: What is important is the order of the tags, not their names. let ocaml_variant_root = make_ocaml_movement(cr, &OCaml::unit()); let ocaml_variant = cr.get(&ocaml_variant_root); let result = ocaml_unpack_variant! { ocaml_variant => { // Alternative: StepLeft => Movement::StepLeft // <anyname> => <build-expr> Movement::StepLeft, Movement::StepRight, // Tag field names are mandatory Movement::Rotate(rotation: OCamlFloat), } }.unwrap(); // ...