Browse Source

Immediately reply to RoomListRequest.

wip
Titouan Rigoudy 4 years ago
parent
commit
e0b95fdbdf
2 changed files with 49 additions and 3 deletions
  1. +1
    -1
      client/src/context.rs
  2. +48
    -2
      client/src/handlers/room_list_request_handler.rs

+ 1
- 1
client/src/context.rs View File

@ -67,7 +67,7 @@ impl Default for ContextOptions {
impl ContextBundle {
/// Builds a new context bundle as configured by `options`.
fn new(options: ContextOptions) -> Self {
pub fn new(options: ContextOptions) -> Self {
let (server_request_tx, server_request_rx) =
channel(options.server_request_buffer);
let (control_response_tx, control_response_rx) =


+ 48
- 2
client/src/handlers/room_list_request_handler.rs View File

@ -2,6 +2,7 @@ use anyhow::Context as AnyhowContext;
use solstice_proto::ServerRequest;
use crate::context::Context;
use crate::control;
use crate::message_handler::MessageHandler;
#[derive(Debug, Default)]
@ -11,7 +12,20 @@ impl MessageHandler for RoomListRequestHandler {
type Message = ();
fn run(self, context: &Context, _message: &()) -> anyhow::Result<()> {
// TODO: Send `RoomListResponse` back over socket.
{
let guard = context.state.lock();
let rooms = guard.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")?;
}
context
.server_request_tx
.blocking_send(ServerRequest::RoomListRequest)
@ -26,10 +40,13 @@ impl MessageHandler for RoomListRequestHandler {
#[cfg(test)]
mod tests {
use solstice_proto::server::RoomListResponse;
use solstice_proto::ServerRequest;
use crate::context::ContextBundle;
use crate::context::{ContextBundle, ContextOptions};
use crate::control;
use crate::message_handler::MessageHandler;
use crate::room::{Room, Visibility};
use super::RoomListRequestHandler;
@ -45,4 +62,33 @@ mod tests {
assert_eq!(request, ServerRequest::RoomListRequest);
}
#[test]
fn run_sends_immediate_response() {
let mut options = ContextOptions::default();
options.initial_state.rooms.set_room_list(RoomListResponse {
rooms: vec![("potato".to_string(), 123), ("apple".to_string(), 42)],
owned_private_rooms: vec![],
other_private_rooms: vec![],
operated_private_room_names: vec![],
});
let mut bundle = ContextBundle::new(options);
RoomListRequestHandler::default()
.run(&bundle.context, &())
.unwrap();
let response = bundle.control_response_rx.blocking_recv().unwrap();
assert_eq!(
response,
control::Response::RoomListResponse(control::RoomListResponse {
rooms: vec![
("apple".to_string(), Room::new(Visibility::Public, 42)),
("potato".to_string(), Room::new(Visibility::Public, 123)),
]
})
);
}
}

Loading…
Cancel
Save