Macro fixt::fixturator

source ·
macro_rules! fixturator {
    (
        with_vec $min:literal $max:literal;
        $type:tt;
        $($munch:tt)*
    ) => { ... };
    (
        $type:tt;
        variants [ $( $variant:tt($variant_inner:ty) )* ];
        $($munch:tt)*
    ) => { ... };
    (
        $type:tt;
        unit variants [ $( $variant:tt )* ] empty $empty:tt;
        $($munch:tt)*
    ) => { ... };
    (
            $type:tt;
            enum [ $( $variant:tt )* ];
            $($munch:tt)*
        ) => { ... };
    ( $type:ident; from $from:ty; $($munch:tt)* ) => { ... };
    ( $type:ident; constructor fn $fn:tt( $( $newtype:ty ),* ); $($munch:tt)* ) => { ... };
    ( $type:ident; vanilla fn $fn:tt( $( $newtype:ty ),* ); $($munch:tt)* ) => { ... };
    ( $type:ident; curve $curve:ident $e:expr; $($munch:tt)* ) => { ... };
    ( $type:ident; $($munch:tt)* ) => { ... };
    ( $type:ident, $empty:expr, $unpredictable:expr, $predictable:expr ) => { ... };
}
Expand description

implements a FooFixturator for any type Foo this simply wraps Fixturator<Foo, Curve> up as FooFixturator<Curve>

this macro serves a few purposes:

  • we avoid the orphan rule that would prevent us implementing Iterator on Fixturator directly
  • we avoid the verbosity of type and impl juggling around every new FooFixturator
  • we create a FooFixturator implementation that is compatible with basic_test! macro
  • we cover all three basic curves
  • we standardiize the new() and new_indexed() methods without relying on traits

the expressions passed into the macro are the body of the next calls for Empty, Unpredictable and Predictable, in order