#[macro_export]
macro_rules! match_messages {
(
actor: $actor:ident;
error: $error:ident;
$(#[$meta:meta])*
$msg_enum:ident {
$(
$req:ident $(-> $resp:ty)?;
)*
}
) => {
$(#[$meta])*
pub enum $msg_enum {
$(
$req(
match_messages!(@wrap $req $(, $resp)?)
)
),*
}
#[async_trait::async_trait]
impl $crate::handler::ActorMessageHandlerTrait<$msg_enum, $error> for $actor {
async fn __handle(&mut self, msg: $msg_enum) -> Result<(), $crate::error::handler::BaseHandlerError<$error>> {
use $crate::handler::BaseHandlerTrait;
match msg {
$(
$msg_enum::$req(inner) => {
$crate::handler::BaseHandler::_handle(self, inner).await.map_err(|err| err.into())
}
),*
}
}
}
$(
impl $crate::messaging::MessageRequest<$msg_enum> for match_messages!(@wrap $req $(, $resp)?) {
fn get_case() -> fn(Self) -> $msg_enum {
$msg_enum::$req
}
}
)*
};
(@wrap $req:ty, $resp:ty) => {
$crate::messaging::AskMessage<$req, $resp>
};
(@wrap $req:ty) => {
$crate::messaging::TellMessage<$req>
};
}