use std::sync::{Arc, Mutex}; use borsh_derive::{BorshDeserialize, BorshSerialize}; use crosstown_bus::{HandleError, MessageHandler}; #[derive(Debug, Clone, BorshDeserialize, BorshSerialize)] pub struct UserCreatedMessage { pub user_id: String, pub user_name: String, pub email: String, } pub struct NotifyUserHandler { received_messages: Arc>>, } impl NotifyUserHandler { pub fn new(received_messages: Arc>>) -> Self { Self { received_messages } } } impl MessageHandler for NotifyUserHandler { fn handle(&self, message: Box) -> Result<(), HandleError> { self.received_messages.lock().unwrap().push(*message.clone()); if message.user_id == "100".to_owned() { return Err(HandleError::new("ID 100 rejected on NotifyUserHandler".to_owned(), false)); } println!("Message received on NotifyUserHandler: {:?}", message); Ok(()) } } pub struct AddUserToDBHandler { received_messages: Arc>>, } impl AddUserToDBHandler { pub fn new(received_messages: Arc>>) -> Self { Self { received_messages } } } impl MessageHandler for AddUserToDBHandler { fn handle(&self, message: Box) -> Result<(), HandleError> { self.received_messages.lock().unwrap().push(*message.clone()); if message.user_id == "100".to_owned() { return Err(HandleError::new("ID 100 rejected on AddUserToDBHandler".to_owned(), false)); } println!("Message received on AddUserToDBHandler: {:?}", message); Ok(()) } } pub struct AddUserToDBDeadLetterHandler { received_messages: Arc>>, } impl AddUserToDBDeadLetterHandler { pub fn new(received_messages: Arc>>) -> Self { Self { received_messages } } } impl MessageHandler for AddUserToDBDeadLetterHandler { fn handle(&self, message: Box) -> Result<(), HandleError> { self.received_messages.lock().unwrap().push(*message.clone()); println!("Dead letter for AddUserToDBHandler message received: {:?}", message); Ok(()) } }