Add derive macros for standard states and transitions
Issue
Currently every single empty state and transition has to be implemented. This gets cumbersome if a lot of state have empty transitions and state implementations are empty. For example:
impl State for Offline {}
impl State for Standby {}
impl Into<Offline> for Online {
fn into(self) -> Offline {
Offline {}
}
}
impl Transition<Online> for Offline {
fn guard(&self) -> TransitGuard {
true.into()
}
}
impl Into<Requesting> for Standby {
fn into(self) -> Requesting {
Requesting {}
}
}
impl Transition<Requesting> for Standby {
fn guard(&self) -> TransitGuard {
false.into()
}
}
By providing according derive macros, all of this unnecessary boiler plate code could be cleaned up.
Suggested derive macros:
- StateEmpty
- TransitionIntoDefault
- TransitionAlways
- TransitionNever
Macros
StateEmpty
Generates:
impl State for Offline {}
TransitionIntoDefault
Generates:
impl Into<Offline> for Online {
fn into(self) -> Offline {
Offline {}
}
}
TransitionAlways
Generates:
impl Transition<Online> for Offline {
fn guard(&self) -> TransitGuard {
true.into()
}
}
TransitionNever
Generates:
impl Transition<Online> for Offline {
fn guard(&self) -> TransitGuard {
false.into()
}
}
End result
This would reduce the initially given example down to:
#[derive(StateEmpty, TransitionIntoDefault, TransitionAlways)]
impl State for Offline {}
#[derive(StateEmpty, TransitionIntoDefault, TransitionNever)]
impl State for Standby {}
Edited by Samuel Schüpbach