From 7fb8e3b1805af81e07fd631bddd65675b9dcc6b4 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Sun, 11 Dec 2022 21:04:12 +0000 Subject: [PATCH] Migrate RoomListResponseHandler. --- client/src/handlers/mod.rs | 2 - .../handlers/room_list_response_handler.rs | 85 ------------------- client/src/room/event.rs | 85 +++++++++++++++---- 3 files changed, 67 insertions(+), 105 deletions(-) delete mode 100644 client/src/handlers/room_list_response_handler.rs diff --git a/client/src/handlers/mod.rs b/client/src/handlers/mod.rs index 8bd97ee..c6acb89 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_list_response_handler; mod room_message_request_handler; mod room_message_response_handler; mod user_list_request_handler; @@ -11,7 +10,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_list_response_handler::RoomListResponseHandler; pub use room_message_request_handler::RoomMessageRequestHandler; pub use room_message_response_handler::RoomMessageResponseHandler; pub use user_list_request_handler::UserListRequestHandler; diff --git a/client/src/handlers/room_list_response_handler.rs b/client/src/handlers/room_list_response_handler.rs deleted file mode 100644 index 4db1f6b..0000000 --- a/client/src/handlers/room_list_response_handler.rs +++ /dev/null @@ -1,85 +0,0 @@ -use anyhow::Context as AnyhowContext; -use solstice_proto::server::RoomListResponse; - -use crate::context::Context; -use crate::control; -use crate::message_handler::MessageHandler; - -#[derive(Debug, Default)] -pub struct RoomListResponseHandler; - -impl MessageHandler for RoomListResponseHandler { - type Message = RoomListResponse; - - fn run( - self, - context: &mut Context, - message: &RoomListResponse, - ) -> anyhow::Result<()> { - let response = message.clone(); - context.state.rooms.set_room_list(response); - - let rooms = context.state.rooms.get_room_list(); - let control_response = - control::Response::RoomListResponse(control::RoomListResponse { rooms }); - - context - .control_response_tx - .blocking_send(control_response) - .context("sending control response")?; - Ok(()) - } - - fn name() -> String { - "RoomListResponseHandler".to_string() - } -} - -#[cfg(test)] -mod tests { - use solstice_proto::server::RoomListResponse; - - use crate::context::ContextBundle; - use crate::message_handler::MessageHandler; - use crate::room::{RoomState, RoomVisibility}; - - use super::RoomListResponseHandler; - - // Cannot get the compiler to be satisfied when borrowing the name... - fn room_name(pair: &(String, RoomState)) -> String { - pair.0.clone() - } - - #[test] - fn run_sets_room_list() { - let mut bundle = ContextBundle::default(); - - let response = RoomListResponse { - rooms: vec![("potato".to_string(), 123), ("apple".to_string(), 42)], - owned_private_rooms: vec![], - other_private_rooms: vec![], - operated_private_room_names: vec![], - }; - - RoomListResponseHandler::default() - .run(&mut bundle.context, &response) - .unwrap(); - - let mut rooms = bundle.context.state.rooms.get_room_list(); - rooms.sort_by_key(room_name); - - assert_eq!( - rooms, - vec![ - ( - "apple".to_string(), - RoomState::new(RoomVisibility::Public, 42) - ), - ( - "potato".to_string(), - RoomState::new(RoomVisibility::Public, 123) - ), - ] - ); - } -} diff --git a/client/src/room/event.rs b/client/src/room/event.rs index 6feb1f9..522a2d7 100644 --- a/client/src/room/event.rs +++ b/client/src/room/event.rs @@ -7,10 +7,7 @@ use solstice_proto::ServerRequest; use crate::context::Context; use crate::control; -use crate::handlers::{ - RoomListResponseHandler, RoomMessageRequestHandler, - RoomMessageResponseHandler, -}; +use crate::handlers::{RoomMessageRequestHandler, RoomMessageResponseHandler}; use crate::message_handler::MessageHandler; /// An event affecting the chat room module. @@ -72,9 +69,7 @@ fn handle_join_request( .blocking_send(ServerRequest::RoomJoinRequest(server::RoomJoinRequest { room_name, })) - .context("sending server request")?; - - Ok(()) + .context("sending server request") } fn handle_join_response( @@ -94,8 +89,7 @@ fn handle_join_response( context .control_response_tx .blocking_send(control_response) - .context("sending control response")?; - Ok(()) + .context("sending control response") } fn handle_list_request(context: &mut Context) -> anyhow::Result<()> { @@ -111,8 +105,23 @@ fn handle_list_request(context: &mut Context) -> anyhow::Result<()> { context .server_request_tx .blocking_send(ServerRequest::RoomListRequest) - .context("sending server request")?; - Ok(()) + .context("sending server request") +} + +fn handle_list_response( + context: &mut Context, + response: server::RoomListResponse, +) -> anyhow::Result<()> { + context.state.rooms.set_room_list(response); + + let rooms = context.state.rooms.get_room_list(); + let control_response = + control::Response::RoomListResponse(control::RoomListResponse { rooms }); + + context + .control_response_tx + .blocking_send(control_response) + .context("sending control response") } impl HandleRoomEvent for RoomEventHandler { @@ -131,7 +140,7 @@ impl HandleRoomEvent for RoomEventHandler { } RoomEvent::ListRequest => handle_list_request(context), RoomEvent::ListResponse(response) => { - RoomListResponseHandler::default().run(context, &response) + handle_list_response(context, response) } RoomEvent::MessageRequest(request) => { RoomMessageRequestHandler::default().run(context, &request) @@ -168,6 +177,8 @@ pub mod testing { #[cfg(test)] mod tests { + use std::cmp::Ordering; + use solstice_proto::server; use crate::context::{ContextBundle, ContextOptions}; @@ -327,6 +338,16 @@ mod tests { assert_eq!(request, ServerRequest::RoomListRequest); } + // `sort_by_key()` cannot handle an extractor function that returns + // references, so we use `sort_by()` and a comparator instead. + // See: https://github.com/rust-lang/rust/issues/34162 + fn compare_by_name( + lhs: &(String, RoomState), + rhs: &(String, RoomState), + ) -> Ordering { + lhs.0.cmp(&rhs.0) + } + #[test] fn handle_list_request_sends_immediate_response() { let mut options = ContextOptions::default(); @@ -355,12 +376,40 @@ mod tests { _ => panic!("Unexpected control response: {:?}", response), }; - // `sort_by_key()` cannot handle an extractor function that returns - // references, so we use `sort_by()` instead. - // See: https://github.com/rust-lang/rust/issues/34162 - rooms.sort_unstable_by(|(ref lhs_name, _), (ref rhs_name, _)| { - lhs_name.cmp(rhs_name) - }); + rooms.sort_unstable_by(compare_by_name); + + assert_eq!( + rooms, + vec![ + ( + "apple".to_string(), + RoomState::new(RoomVisibility::Public, 42) + ), + ( + "potato".to_string(), + RoomState::new(RoomVisibility::Public, 123) + ), + ] + ); + } + + #[test] + fn handle_list_response_sets_room_list() { + let mut bundle = ContextBundle::default(); + + let response = server::RoomListResponse { + rooms: vec![("potato".to_string(), 123), ("apple".to_string(), 42)], + owned_private_rooms: vec![], + other_private_rooms: vec![], + operated_private_room_names: vec![], + }; + + RoomEventHandler + .handle(&mut bundle.context, RoomEvent::ListResponse(response)) + .expect("handling response"); + + let mut rooms = bundle.context.state.rooms.get_room_list(); + rooms.sort_unstable_by(compare_by_name); assert_eq!( rooms,