use std::error::Error;
use std::fmt::{self, Debug, Display, Formatter};
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum StateMachineBuildError<S, E> {
InitialStateNotRegistered {
state: S,
},
FinalStateNotRegistered {
state: S,
},
TransitionSourceNotRegistered {
source: S,
event: E,
target: S,
},
TransitionTargetNotRegistered {
source: S,
event: E,
target: S,
},
DuplicateTransition {
source: S,
event: E,
existing_target: S,
new_target: S,
},
}
impl<S, E> Display for StateMachineBuildError<S, E>
where
S: Debug,
E: Debug,
{
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::InitialStateNotRegistered { state } => {
write!(formatter, "initial state is not registered: {state:?}")
}
Self::FinalStateNotRegistered { state } => {
write!(formatter, "final state is not registered: {state:?}")
}
Self::TransitionSourceNotRegistered {
source,
event,
target,
} => write!(
formatter,
"transition source is not registered: {source:?} --{event:?}--> {target:?}"
),
Self::TransitionTargetNotRegistered {
source,
event,
target,
} => write!(
formatter,
"transition target is not registered: {source:?} --{event:?}--> {target:?}"
),
Self::DuplicateTransition {
source,
event,
existing_target,
new_target,
} => write!(
formatter,
"duplicate transition target: {source:?} --{event:?}--> \
{existing_target:?} conflicts with {new_target:?}"
),
}
}
}
impl<S, E> Error for StateMachineBuildError<S, E>
where
S: Debug,
E: Debug,
{
}