From 94d7716ed86ea6644af514dc23632044bf96ec37 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Tue, 17 Aug 2021 23:51:16 +0200 Subject: [PATCH] Rework MessageHandler to use associated types. --- client/src/dispatcher.rs | 8 ++++---- client/src/handlers/room_list_request_handler.rs | 12 +++++++----- .../src/handlers/room_message_request_handler.rs | 12 +++++++----- .../src/handlers/set_privileged_users_handler.rs | 8 ++++---- client/src/handlers/set_room_list_handler.rs | 15 +++++++++------ client/src/message_handler.rs | 12 +++++++++--- 6 files changed, 40 insertions(+), 27 deletions(-) diff --git a/client/src/dispatcher.rs b/client/src/dispatcher.rs index ea00aeb..c96ce80 100644 --- a/client/src/dispatcher.rs +++ b/client/src/dispatcher.rs @@ -35,15 +35,15 @@ impl From for Message { /// Pairs together a message and its handler as chosen by the dispatcher. /// Implements Job so as to be scheduled on an executor. -struct DispatchedMessage { +struct DispatchedMessage { message: M, handler: H, } -impl Job for DispatchedMessage +impl Job for DispatchedMessage::Message> where - M: Debug + Send, - H: MessageHandler + Send, + H: MessageHandler + Send, + ::Message: Debug + Send, { fn execute(self: Box, context: &Context) { if let Err(error) = self.handler.run(context, &self.message) { diff --git a/client/src/handlers/room_list_request_handler.rs b/client/src/handlers/room_list_request_handler.rs index 28b5b42..d323c17 100644 --- a/client/src/handlers/room_list_request_handler.rs +++ b/client/src/handlers/room_list_request_handler.rs @@ -1,5 +1,4 @@ -use std::io; - +use anyhow::Context as AnyhowContext; use solstice_proto::ServerRequest; use crate::context::Context; @@ -8,12 +7,15 @@ use crate::message_handler::MessageHandler; #[derive(Debug, Default)] pub struct RoomListRequestHandler; -impl MessageHandler<()> for RoomListRequestHandler { - fn run(self, context: &Context, message: &()) -> io::Result<()> { +impl MessageHandler for RoomListRequestHandler { + type Message = (); + + fn run(self, context: &Context, _message: &()) -> anyhow::Result<()> { // TODO: Send `RoomListResponse` back over socket. context .server_request_tx - .blocking_send(ServerRequest::RoomListRequest); + .blocking_send(ServerRequest::RoomListRequest) + .context("sending server request")?; Ok(()) } diff --git a/client/src/handlers/room_message_request_handler.rs b/client/src/handlers/room_message_request_handler.rs index 8706ce8..af7734b 100644 --- a/client/src/handlers/room_message_request_handler.rs +++ b/client/src/handlers/room_message_request_handler.rs @@ -1,5 +1,4 @@ -use std::io; - +use anyhow::Context as AnyhowContext; use solstice_proto::server; use solstice_proto::ServerRequest; @@ -10,12 +9,14 @@ use crate::message_handler::MessageHandler; #[derive(Debug, Default)] pub struct RoomMessageRequestHandler; -impl MessageHandler for RoomMessageRequestHandler { +impl MessageHandler for RoomMessageRequestHandler { + type Message = control::RoomMessageRequest; + fn run( self, context: &Context, message: &control::RoomMessageRequest, - ) -> io::Result<()> { + ) -> anyhow::Result<()> { context .server_request_tx .blocking_send(ServerRequest::RoomMessageRequest( @@ -23,7 +24,8 @@ impl MessageHandler for RoomMessageRequestHandler { room_name: message.room_name.clone(), message: message.message.clone(), }, - )); + )) + .context("sending server request")?; Ok(()) } diff --git a/client/src/handlers/set_privileged_users_handler.rs b/client/src/handlers/set_privileged_users_handler.rs index 329b23a..f05b098 100644 --- a/client/src/handlers/set_privileged_users_handler.rs +++ b/client/src/handlers/set_privileged_users_handler.rs @@ -1,5 +1,3 @@ -use std::io; - use solstice_proto::server::PrivilegedUsersResponse; use crate::context::Context; @@ -8,12 +6,14 @@ use crate::message_handler::MessageHandler; #[derive(Debug, Default)] pub struct SetPrivilegedUsersHandler; -impl MessageHandler for SetPrivilegedUsersHandler { +impl MessageHandler for SetPrivilegedUsersHandler { + type Message = PrivilegedUsersResponse; + fn run( self, context: &Context, message: &PrivilegedUsersResponse, - ) -> io::Result<()> { + ) -> anyhow::Result<()> { let users = message.users.clone(); context.state.lock().users.set_all_privileged(users); Ok(()) diff --git a/client/src/handlers/set_room_list_handler.rs b/client/src/handlers/set_room_list_handler.rs index c8683de..48c5001 100644 --- a/client/src/handlers/set_room_list_handler.rs +++ b/client/src/handlers/set_room_list_handler.rs @@ -1,5 +1,4 @@ -use std::io; - +use anyhow::Context as AnyhowContext; use solstice_proto::server::RoomListResponse; use crate::context::Context; @@ -9,12 +8,14 @@ use crate::message_handler::MessageHandler; #[derive(Debug, Default)] pub struct SetRoomListHandler; -impl MessageHandler for SetRoomListHandler { +impl MessageHandler for SetRoomListHandler { + type Message = RoomListResponse; + fn run( self, context: &Context, message: &RoomListResponse, - ) -> io::Result<()> { + ) -> anyhow::Result<()> { let response = (*message).clone(); { let mut guard = context.state.lock(); @@ -27,8 +28,10 @@ impl MessageHandler for SetRoomListHandler { rooms, }); - // TODO: decide what to do with errors here. - context.control_response_tx.blocking_send(control_response); + context + .control_response_tx + .blocking_send(control_response) + .context("sending control response")?; } Ok(()) } diff --git a/client/src/message_handler.rs b/client/src/message_handler.rs index 470ee2b..7662ed1 100644 --- a/client/src/message_handler.rs +++ b/client/src/message_handler.rs @@ -1,4 +1,4 @@ -use std::io; +use std::fmt::Debug; use crate::context::Context; @@ -6,9 +6,15 @@ use crate::context::Context; /// /// Message types are mapped to handler types by Dispatcher. /// This trait is intended to allow composing handler logic. -pub trait MessageHandler { +pub trait MessageHandler: Debug { + type Message; + /// Attempts to handle the given message against the given context. - fn run(self, context: &Context, message: &Message) -> io::Result<()>; + fn run( + self, + context: &Context, + message: &Self::Message, + ) -> anyhow::Result<()>; /// Returns the name of this handler type. fn name() -> String;