diff --git a/client/src/dispatcher.rs b/client/src/dispatcher.rs index 5d10e03..ef74f0a 100644 --- a/client/src/dispatcher.rs +++ b/client/src/dispatcher.rs @@ -10,7 +10,8 @@ use crate::control::Request as ControlRequest; use crate::executor::Job; use crate::handlers::{ RoomJoinRequestHandler, RoomJoinResponseHandler, RoomListRequestHandler, - RoomMessageRequestHandler, SetPrivilegedUsersHandler, SetRoomListHandler, + RoomMessageRequestHandler, RoomMessageResponseHandler, + SetPrivilegedUsersHandler, SetRoomListHandler, }; use crate::message_handler::MessageHandler; @@ -81,6 +82,12 @@ impl Dispatcher { handler: RoomJoinResponseHandler::default(), })) } + Message::ServerResponse(ServerResponse::RoomMessageResponse( + response, + )) => Some(Box::new(DispatchedMessage { + message: response, + handler: RoomMessageResponseHandler::default(), + })), Message::ServerResponse(ServerResponse::RoomListResponse(response)) => { Some(Box::new(DispatchedMessage { message: response, @@ -165,6 +172,20 @@ mod tests { .is_some()); } + #[test] + fn dispatches_room_message_response() { + assert!(Dispatcher::new() + .dispatch(Message::ServerResponse( + server::RoomMessageResponse { + room_name: "bleep".to_string(), + user_name: "shruti".to_string(), + message: "yo!".to_string(), + } + .into() + )) + .is_some()); + } + #[test] fn dispatches_room_list_response() { assert!(Dispatcher::new() diff --git a/client/src/handlers/mod.rs b/client/src/handlers/mod.rs index 4fbec5e..bf226f6 100644 --- a/client/src/handlers/mod.rs +++ b/client/src/handlers/mod.rs @@ -2,6 +2,7 @@ mod room_join_request_handler; mod room_join_response_handler; mod room_list_request_handler; mod room_message_request_handler; +mod room_message_response_handler; mod set_privileged_users_handler; mod set_room_list_handler; @@ -9,5 +10,6 @@ pub use room_join_request_handler::RoomJoinRequestHandler; pub use room_join_response_handler::RoomJoinResponseHandler; pub use room_list_request_handler::RoomListRequestHandler; pub use room_message_request_handler::RoomMessageRequestHandler; +pub use room_message_response_handler::RoomMessageResponseHandler; pub use set_privileged_users_handler::SetPrivilegedUsersHandler; pub use set_room_list_handler::SetRoomListHandler; diff --git a/client/src/handlers/room_message_response_handler.rs b/client/src/handlers/room_message_response_handler.rs new file mode 100644 index 0000000..944d80e --- /dev/null +++ b/client/src/handlers/room_message_response_handler.rs @@ -0,0 +1,77 @@ +use anyhow::Context as AnyhowContext; +use solstice_proto::server; + +use crate::context::Context; +use crate::control; +use crate::message_handler::MessageHandler; + +#[derive(Debug, Default)] +pub struct RoomMessageResponseHandler; + +impl MessageHandler for RoomMessageResponseHandler { + type Message = server::RoomMessageResponse; + + fn run( + self, + context: &Context, + message: &server::RoomMessageResponse, + ) -> anyhow::Result<()> { + // TODO: Append message to room struct. + context + .control_response_tx + .blocking_send(control::Response::RoomMessageResponse( + control::RoomMessageResponse { + room_name: message.room_name.clone(), + user_name: message.user_name.clone(), + message: message.message.clone(), + }, + )) + .context("sending control response")?; + Ok(()) + } + + fn name() -> String { + "RoomMessageResponseHandler".to_string() + } +} + +#[cfg(test)] +mod tests { + use solstice_proto::server; + + use crate::context::ContextBundle; + use crate::control; + use crate::message_handler::MessageHandler; + + use super::RoomMessageResponseHandler; + + #[test] + fn run_forwards_response() { + let mut bundle = ContextBundle::default(); + + RoomMessageResponseHandler::default() + .run( + &bundle.context, + &server::RoomMessageResponse { + room_name: "bleep".to_string(), + user_name: "shruti".to_string(), + message: "yo!".to_string(), + }, + ) + .expect("running handler"); + + let response = bundle + .control_response_rx + .blocking_recv() + .expect("receiving control response"); + + assert_eq!( + response, + control::Response::RoomMessageResponse(control::RoomMessageResponse { + room_name: "bleep".to_string(), + user_name: "shruti".to_string(), + message: "yo!".to_string(), + }) + ); + } +}