-
Notifications
You must be signed in to change notification settings - Fork 39
Description
Currently, defining a Handler requires the usage of async_trait and filling in various elements into a trait impl.
In theory however, a macro can learn all required pieces of information from the following code block:
impl Actor {
pub async fn handle_message(&mut self, message: Message) -> i32 {
todo!()
}
}This needs to be expanded to:
#[async_trait::async_trait]
impl Handler<Message> for Actor {
type Return = i32;
fn handle(&mut self, message: Message, _ctx: &mut Context<Self>) -> i32 {
todo!()
}
}This is what https://github.com/comit-network/xtra-productivity does although it is not yet updated to the latest version of xtra where f.e. the Message type is already removed. @klochowicz and myself authored that crate at my last gig. I think it would be nice to pull this into this repository as a separate crate, re-export it through xtra and expose it as xtra::handler so it can be used like:
#[xtra::handler]
impl Actor {
// function definitions here
}The main features of the macro are:
- Creates 1
impl Handlerper fn in theimplblock - Removes duplicate mention of message and return type
- Allows omitting
Contextif not used
https://github.com/comit-network/xtra-productivity would need a lot of polish before it can be officially released, esp. in regards to error messages. The implementation isn't too complex so we can also start from scratch if necessary.