Solstice client.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

85 lines
2.0 KiB

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