use async_trait::async_trait;
use crate::callbacks::Finitomata;
#[async_trait]
pub trait Listener<F: Finitomata>: Send + Sync {
async fn on_transition(&self, name: &str, from: &F::State, to: &F::State, event: &F::Event);
}
pub struct NoopListener;
#[async_trait]
impl<F: Finitomata> Listener<F> for NoopListener {
async fn on_transition(
&self,
_name: &str,
_from: &F::State,
_to: &F::State,
_event: &F::Event,
) {
}
}
pub struct TracingListener;
#[async_trait]
impl<F: Finitomata> Listener<F> for TracingListener {
async fn on_transition(&self, name: &str, from: &F::State, to: &F::State, event: &F::Event) {
tracing::info!(
fsm = name,
from = ?from,
to = ?to,
event = ?event,
"FSM transition"
);
}
}