Browse Source

Migrate RoomListResponseHandler.

main
Titouan Rigoudy 2 years ago
parent
commit
7fb8e3b180
3 changed files with 67 additions and 105 deletions
  1. +0
    -2
      client/src/handlers/mod.rs
  2. +0
    -85
      client/src/handlers/room_list_response_handler.rs
  3. +67
    -18
      client/src/room/event.rs

+ 0
- 2
client/src/handlers/mod.rs View File

@ -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;

+ 0
- 85
client/src/handlers/room_list_response_handler.rs View File

@ -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)
),
]
);
}
}

+ 67
- 18
client/src/room/event.rs View File

@ -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,


Loading…
Cancel
Save