use super::TransitionInventory;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct MachineGraph<S: 'static, T: 'static> {
pub machine: MachineDescriptor,
pub states: &'static [StateDescriptor<S>],
pub transitions: TransitionInventory<S, T>,
}
impl<S, T> MachineGraph<S, T>
where
S: Copy + Eq + 'static,
T: Copy + Eq + 'static,
{
pub fn machine_label(&self) -> &'static str {
self.machine.rust_type_path
}
pub fn state_label(&self, id: S) -> Option<&'static str> {
self.state(id).map(|state| state.rust_name)
}
pub fn transition_label(&self, id: T) -> Option<&'static str> {
self.transition(id).map(|transition| transition.method_name)
}
pub fn state(&self, id: S) -> Option<&StateDescriptor<S>> {
self.states.iter().find(|state| state.id == id)
}
pub fn transition(&self, id: T) -> Option<&TransitionDescriptor<S, T>> {
self.transitions
.iter()
.find(|transition| transition.id == id)
}
pub fn transitions_from(
&self,
state: S,
) -> impl Iterator<Item = &TransitionDescriptor<S, T>> + '_ {
self.transitions
.iter()
.filter(move |transition| transition.from == state)
}
pub fn transition_from_method(
&self,
state: S,
method_name: &str,
) -> Option<&TransitionDescriptor<S, T>> {
self.transitions
.iter()
.find(|transition| transition.from == state && transition.method_name == method_name)
}
pub fn transitions_named<'a>(
&'a self,
method_name: &'a str,
) -> impl Iterator<Item = &'a TransitionDescriptor<S, T>> + 'a {
self.transitions
.iter()
.filter(move |transition| transition.method_name == method_name)
}
pub fn legal_targets(&self, id: T) -> Option<&'static [S]> {
self.transition(id).map(|transition| transition.to)
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct MachineDescriptor {
pub module_path: &'static str,
pub rust_type_path: &'static str,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct StateDescriptor<S: 'static> {
pub id: S,
pub rust_name: &'static str,
pub has_data: bool,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct TransitionDescriptor<S: 'static, T: 'static> {
pub id: T,
pub method_name: &'static str,
pub from: S,
pub to: &'static [S],
}