use async_trait::async_trait;
use orsomafo::{Dispatchable, DispatchedEvent, EventDispatcherBuilder, EventHandler, Subscriber};
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
pretty_env_logger::init();
let handlers = Subscriber::new()
.listen::<UserCreated, SendWelcomeEmail>()
.listen::<UserCreated, HandleUserCreated>();
let _ = EventDispatcherBuilder::new()
.subscribe(handlers)
.build()
.await;
Subscriber::new()
.listen::<UserCreated, SendWelcomeEmail>()
.listen::<UserCreated, HandleUserCreated>()
.build() .await;
let user = UserCreated { id: 1 };
user.dispatch_event();
sleep(Duration::from_millis(100)).await;
}
#[derive(Debug, Clone)]
struct UserCreated {
id: u32,
}
impl Dispatchable for UserCreated {}
#[derive(Default)]
struct HandleUserCreated;
#[async_trait]
impl EventHandler for HandleUserCreated {
async fn handle(&self, dispatched: &DispatchedEvent) {
let event: UserCreated = dispatched.the_event().unwrap();
println!("we are handling user created event: {:?}", event.id)
}
}
struct SendWelcomeEmail(String);
impl Default for SendWelcomeEmail {
fn default() -> Self {
Self("noreplay@example.com".into())
}
}
#[async_trait]
impl EventHandler for SendWelcomeEmail {
async fn handle(&self, event: &DispatchedEvent) {
let user = event.the_event::<UserCreated>().unwrap();
println!(
"Sending welcoming email to new user {:?} from {:?}",
user.id, &self.0
);
}
}