use async_trait::async_trait;
use orsomafo::{Dispatchable, DispatchedEvent, EventDispatcherBuilder, EventHandler};
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
pretty_env_logger::init();
let generic_event = "workflow_state_changed";
let dispatcher = EventDispatcherBuilder::new()
.listen_str_fn(generic_event, |event| {
Box::pin(async move {
println!("handled by 'listen_str_fn' >> {:}", event.data());
})
})
.listen_str::<HandleWorkflowEvent>(generic_event)
.listen_str_with(generic_event, HandleWorkflowEvent)
.build()
.await;
dispatcher.dispatch_str(generic_event, WorkflowState::Started);
dispatcher.dispatch_str(generic_event, WorkflowState::Stalled);
dispatcher.dispatch_str(generic_event, WorkflowState::Completed);
WorkflowState::Started.dispatch_event_as(generic_event);
WorkflowState::Completed.dispatch_event_as(generic_event);
sleep(Duration::from_millis(100)).await;
}
#[derive(Clone, serde::Deserialize, serde::Serialize)]
enum WorkflowState {
Started,
Stalled,
Completed,
}
impl Dispatchable for WorkflowState {}
#[derive(Debug, Default)]
struct HandleWorkflowEvent;
#[async_trait]
impl EventHandler for HandleWorkflowEvent {
async fn handle(&self, event: DispatchedEvent) {
println!(
"handled by 'HandleWorkflowEvent' struct >> {:}",
event.data_ref()
)
}
}