rotor::rotor_compose! [] [src]

macro_rules! rotor_compose {
    (pub enum $name:ident/$cname:ident <$context_type:ident>
        { $($x:ident ($y:ty),)* }) => { ... };
    (enum $name:ident/$cname:ident <$context_type:ident>
        { $($x:ident ($y:ty),)* }) => { ... };
    (@machine $name:ident/$cname:ident $ctx_typ:ident
        [ $(<$ctx_name:ident $(: $ctx_bound:ident)*>)* ]
        $($iname:ident ($itype:ty),)*) => { ... };
}

Compose multiple state machines into single type

Composition requires two types: the state machine itself and Seed which is used to create children state machines.

Mostly because of limitations of Rust macro system composition only works on concrete context type.

Example

rotor_compose!{
    pub enum Fsm/Seed<Context> {
        Http(HttpMachine)
        Dns(DnsMachine)
    }
}

This creates a an Fsm state machine type which is enum with two options. And Seed state machine type, which is also enum with same option names but uses <HttpMachine as rotor::Machine>::Seed for the wrapped type.