Macro macro_machines::def_machine [] [src]

macro_rules! def_machine {
    ( machine $machine:ident
      $(<$(
        $type_var:ident $(: { $($type_constraint:path),+ })*
      ),+>)*
    {
      STATES [
        $(state $state:ident (
          $($data_name:ident : $data_type:ty $(= $data_default:expr)*),*
        ))+
      ]
      EVENTS [
        $(event $event:ident <$source:tt> $(=> <$target:ident>)*
          ($($param_name:ident : $param_type:ty $(= $param_default:expr)*),*)
          $({ $($state_data:ident),* } => $action:block)*
        )+
      ]
      EXTENDED [
        $($ext_name:ident : $ext_type:ty $(= $ext_default:expr)*),*
      ]
      $(self_reference: $self_reference:ident)*
      initial_state: $initial:ident $({
        $(initial_action: $initial_action:block)*
      })*
      $(terminal_state: $terminal:ident $({
        $(terminate_success: $terminate_success:block)*
        $(terminate_failure: $terminate_failure:block)*
      })*)*
    }

  ) => { ... };
    ( $machine:ident
    $(<$(
      $type_var:ident $(: { $($type_constraint:path),+ })*
    ),+>)*
    $(($(
      $ext_name:ident : $ext_type:ty $(= $ext_default:expr)*
    ),*))*
    $(@ $self_reference:ident)*
    {
      STATES [
        $(state $state:ident (
          $($data_name:ident : $data_type:ty $(= $data_default:expr)*),*
        ))+
      ]
      EVENTS [
        $(event $event:ident <$source:tt> $(=> <$target:ident>)*
          ($($param_name:ident : $param_type:ty $(= $param_default:expr)*),*)
          $({ $($state_data:ident),* } => $action:block)*
        )+
      ]
      initial_state: $initial:ident $({
        $(initial_action: $initial_action:block)*
      })*
      $(terminal_state: $terminal:ident $({
        $(terminate_success: $terminate_success:block)*
        $(terminate_failure: $terminate_failure:block)*
      })*)*
    }

  ) => { ... };
    ( @impl_fn_handle_event
    machine $machine:ident {
      STATES [
        $(state $state:ident (
          $($data_name:ident : $data_type:ty $(= $data_default:expr)*),*
        ))+
      ]
      EVENTS [
        $(event $event:ident <$source:tt> $(=> <$target:ident>)*
          ($($param_name:ident),*)
          $({ $($state_data:ident),* } => $action:block)*
        )+
      ]
      EXTENDED [
        $($ext_name:ident : $ext_type:ty $(= $ext_default:expr)*),*
      ]
      $(self_reference: $self_reference:ident)*
    }

  ) => { ... };
    ( @event_internal_state_pattern
    $source:ident { $($state_data:ident),* }
  ) => { ... };
    ( @event_internal_state_pattern
    * { $($state_data:ident),* }
  ) => { ... };
    ( @event_action_external
    event $event:ident <$source:ident> => <$target:ident> $($action:block)*
  ) => { ... };
    ( @event_action_external
    event $event:ident <$source:ident> $($action:block)*
  ) => { ... };
    ( @event_action_external
    event $event:ident <*> => <$target:ident> $($action:block)*
  ) => { ... };
    ( @event_action_universal
    event $event:ident <*> => <$target:ident> $($action:block)*
  ) => { ... };
    ( @event_action_universal
    event $event:ident <$source:ident> $(=> <$target:ident>)* $($action:block)*
  ) => { ... };
    ( @event_action_internal
    event $event:ident <$source:ident> $($action:block)*
  ) => { ... };
    ( @event_action_internal
    event $event:ident <$source:tt> => <$target:ident> $($action:block)*
  ) => { ... };
    ( @event_transition <$source:ident> => <$target:ident> ) => { ... };
    ( @event_transition <$source:ident> ) => { ... };
    ( @event_transition <*> => <$target:ident> ) => { ... };
    ( @expr_default $default:expr ) => { ... };
    ( @expr_default ) => { ... };
    ( @expr_option $default:expr ) => { ... };
    ( @expr_option ) => { ... };
    ( @base
    machine $machine:ident
      $(<$(
        $type_var:ident $(: { $($type_constraint:path),+ })*
      ),+>)*
    {
      STATES [
        $(state $state:ident (
          $($data_name:ident : $data_type:ty $(= $data_default:expr)*),*
        ))+
      ]
      EVENTS [
        $(event $event:ident <$source:tt> $(=> <$target:ident>)*
          ($($param_name:ident : $param_type:ty $(= $param_default:expr)*),*)
          $({ $($state_data:ident),* } => $action:block)*
        )+
      ]
      EXTENDED [
        $($ext_name:ident : $ext_type:ty $(= $ext_default:expr)*),*
      ]
      $(self_reference: $self_reference:ident)*
      initial_state: $initial:ident $({
        $(initial_action: $initial_action:block)*
      })*
      $(terminal_state: $terminal:ident $({
        $(terminate_success: $terminate_success:block)*
        $(terminate_failure: $terminate_failure:block)*
      })*)*
    }

  ) => { ... };
}

State machines with a default initial state.

For each extended state field, either the type must implement Default, or else a default expression is provided following =.

For a state machine that requires runtime initialization, see def_machine_nodefault!.