From 92b6e18d5e43e6cfb9128cf8120ee14f20189e14 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Fri, 9 Dec 2022 23:41:51 +0000 Subject: [PATCH] Migrate RoomJoinResponseHandler. --- client/src/handlers/mod.rs | 2 - .../handlers/room_join_response_handler.rs | 99 ------------------- client/src/room/event.rs | 71 ++++++++++++- 3 files changed, 68 insertions(+), 104 deletions(-) delete mode 100644 client/src/handlers/room_join_response_handler.rs diff --git a/client/src/handlers/mod.rs b/client/src/handlers/mod.rs index 2dc6b90..9f2d535 100644 --- a/client/src/handlers/mod.rs +++ b/client/src/handlers/mod.rs @@ -2,7 +2,6 @@ mod login_status_request_handler; mod peer_address_response_handler; mod peer_connect_request_handler; mod privileged_users_response_handler; -mod room_join_response_handler; mod room_list_request_handler; mod room_list_response_handler; mod room_message_request_handler; @@ -13,7 +12,6 @@ pub use login_status_request_handler::LoginStatusRequestHandler; pub use peer_address_response_handler::PeerAddressResponseHandler; pub use peer_connect_request_handler::PeerConnectRequestHandler; pub use privileged_users_response_handler::PrivilegedUsersResponseHandler; -pub use room_join_response_handler::RoomJoinResponseHandler; pub use room_list_request_handler::RoomListRequestHandler; pub use room_list_response_handler::RoomListResponseHandler; pub use room_message_request_handler::RoomMessageRequestHandler; diff --git a/client/src/handlers/room_join_response_handler.rs b/client/src/handlers/room_join_response_handler.rs deleted file mode 100644 index 15756c6..0000000 --- a/client/src/handlers/room_join_response_handler.rs +++ /dev/null @@ -1,99 +0,0 @@ -use anyhow::Context as AnyhowContext; -use solstice_proto::server::RoomJoinResponse; - -use crate::context::Context; -use crate::control; -use crate::message_handler::MessageHandler; - -#[derive(Debug, Default)] -pub struct RoomJoinResponseHandler; - -impl MessageHandler for RoomJoinResponseHandler { - type Message = RoomJoinResponse; - - fn run( - self, - context: &mut Context, - response: &RoomJoinResponse, - ) -> anyhow::Result<()> { - { - let room = context.state.rooms.get_mut_strict(&response.room_name)?; - - room.join( - response.owner.clone(), - response.operators.clone(), - &response.users, - ); - - // Send under lock to avoid out-of-order sends. - let control_response = - control::Response::RoomJoinResponse(control::RoomJoinResponse { - room_name: response.room_name.clone(), - room: room.clone_state(), - }); - - context - .control_response_tx - .blocking_send(control_response) - .context("sending control response")?; - } - Ok(()) - } - - fn name() -> String { - "RoomJoinResponseHandler".to_string() - } -} - -#[cfg(test)] -mod tests { - use solstice_proto::server::RoomJoinResponse; - - use crate::context::{ContextBundle, ContextOptions}; - use crate::control; - use crate::message_handler::MessageHandler; - use crate::room::{RoomMembership, RoomState, RoomVisibility}; - - use super::RoomJoinResponseHandler; - - #[test] - fn run_updates_room_state_and_forwards_response() { - let mut room = RoomState::new(RoomVisibility::Public, 42); - - let mut options = ContextOptions::default(); - options - .initial_state - .rooms - .insert("apple".to_string(), room.clone()); - let mut bundle = ContextBundle::new(options); - - let response = RoomJoinResponse { - room_name: "apple".to_string(), - operators: vec!["shruti".to_string()], - owner: Some("kim".to_string()), - users: vec![], - }; - - RoomJoinResponseHandler::default() - .run(&mut bundle.context, &response) - .unwrap(); - - room.membership = RoomMembership::Member; - room.user_count = 0; - room.operators = ["shruti"].iter().map(|s| s.to_string()).collect(); - room.owner = Some("kim".to_string()); - - let rooms = bundle.context.state.rooms.get_room_list(); - - assert_eq!(rooms, vec![("apple".to_string(), room.clone())]); - - let response = bundle.control_response_rx.blocking_recv().unwrap(); - assert_eq!( - response, - control::Response::RoomJoinResponse(control::RoomJoinResponse { - room_name: "apple".to_string(), - room, - }) - ); - } -} diff --git a/client/src/room/event.rs b/client/src/room/event.rs index a637094..5dba7c7 100644 --- a/client/src/room/event.rs +++ b/client/src/room/event.rs @@ -8,8 +8,8 @@ use solstice_proto::ServerRequest; use crate::context::Context; use crate::control; use crate::handlers::{ - RoomJoinResponseHandler, RoomListRequestHandler, RoomListResponseHandler, - RoomMessageRequestHandler, RoomMessageResponseHandler, + RoomListRequestHandler, RoomListResponseHandler, RoomMessageRequestHandler, + RoomMessageResponseHandler, }; use crate::message_handler::MessageHandler; @@ -77,6 +77,27 @@ fn handle_join_request( Ok(()) } +fn handle_join_response( + context: &mut Context, + response: server::RoomJoinResponse, +) -> anyhow::Result<()> { + let room = context.state.rooms.get_mut_strict(&response.room_name)?; + + room.join(response.owner, response.operators, &response.users); + + let control_response = + control::Response::RoomJoinResponse(control::RoomJoinResponse { + room_name: response.room_name, + room: room.clone_state(), + }); + + context + .control_response_tx + .blocking_send(control_response) + .context("sending control response")?; + Ok(()) +} + impl HandleRoomEvent for RoomEventHandler { fn handle( &mut self, @@ -89,7 +110,7 @@ impl HandleRoomEvent for RoomEventHandler { handle_join_request(context, room_name) } RoomEvent::JoinResponse(response) => { - RoomJoinResponseHandler::default().run(context, &response) + handle_join_response(context, response) } RoomEvent::ListRequest => { RoomListRequestHandler::default().run(context, &()) @@ -233,4 +254,48 @@ mod tests { }) ); } + + #[test] + fn handle_join_response_updates_room_state_and_forwards_response() { + let mut room = RoomState::new(RoomVisibility::Public, 42); + + let mut options = ContextOptions::default(); + options + .initial_state + .rooms + .insert("apple".to_string(), room.clone()); + let mut bundle = ContextBundle::new(options); + + let response = server::RoomJoinResponse { + room_name: "apple".to_string(), + operators: vec!["shruti".to_string()], + owner: Some("kim".to_string()), + users: vec![], + }; + + RoomEventHandler + .handle(&mut bundle.context, RoomEvent::JoinResponse(response)) + .expect("handling response"); + + room.membership = RoomMembership::Member; + room.user_count = 0; + room.operators = ["shruti"].iter().map(|s| s.to_string()).collect(); + room.owner = Some("kim".to_string()); + + let rooms = bundle.context.state.rooms.get_room_list(); + + assert_eq!(rooms, vec![("apple".to_string(), room.clone())]); + + let response = bundle + .control_response_rx + .blocking_recv() + .expect("receiving response"); + assert_eq!( + response, + control::Response::RoomJoinResponse(control::RoomJoinResponse { + room_name: "apple".to_string(), + room, + }) + ); + } }