diff --git a/client/src/handlers/room_message_response_handler.rs b/client/src/handlers/room_message_response_handler.rs index 944d80e..124e036 100644 --- a/client/src/handlers/room_message_response_handler.rs +++ b/client/src/handlers/room_message_response_handler.rs @@ -1,13 +1,29 @@ use anyhow::Context as AnyhowContext; +use log::warn; use solstice_proto::server; use crate::context::Context; use crate::control; use crate::message_handler::MessageHandler; +use crate::room::{Message as RoomMessage, RoomMap}; #[derive(Debug, Default)] pub struct RoomMessageResponseHandler; +fn add_message( + rooms: &mut RoomMap, + response: &server::RoomMessageResponse, +) -> anyhow::Result<()> { + let room = rooms + .get_mut_strict(&response.room_name) + .context("looking up room")?; + room.messages.push(RoomMessage { + user_name: response.user_name.clone(), + message: response.message.clone(), + }); + Ok(()) +} + impl MessageHandler for RoomMessageResponseHandler { type Message = server::RoomMessageResponse; @@ -16,7 +32,11 @@ impl MessageHandler for RoomMessageResponseHandler { context: &Context, message: &server::RoomMessageResponse, ) -> anyhow::Result<()> { - // TODO: Append message to room struct. + let mut state = context.state.lock(); + if let Err(err) = add_message(&mut state.rooms, message) { + warn!("Error storing room message: {:#}", err); + } + context .control_response_tx .blocking_send(control::Response::RoomMessageResponse( @@ -39,9 +59,10 @@ impl MessageHandler for RoomMessageResponseHandler { mod tests { use solstice_proto::server; - use crate::context::ContextBundle; + use crate::context::{ContextBundle, ContextOptions}; use crate::control; use crate::message_handler::MessageHandler; + use crate::room::{Message as RoomMessage, Room, Visibility}; use super::RoomMessageResponseHandler; @@ -74,4 +95,49 @@ mod tests { }) ); } + + #[test] + fn run_stores_message() { + let mut room = Room::new(Visibility::Public, 42); + room.messages.push(RoomMessage { + user_name: "karandeep".to_string(), + message: "namaste!".to_string(), + }); + + let mut options = ContextOptions::default(); + options + .initial_state + .rooms + .insert("apple".to_string(), room.clone()); + + let bundle = ContextBundle::new(options); + + RoomMessageResponseHandler::default() + .run( + &bundle.context, + &server::RoomMessageResponse { + room_name: "apple".to_string(), + user_name: "shruti".to_string(), + message: "yo!".to_string(), + }, + ) + .expect("running handler"); + + let state = bundle.context.state.lock(); + let room = state.rooms.get_strict("apple").expect("looking up room"); + + assert_eq!( + room.messages, + vec![ + RoomMessage { + user_name: "karandeep".to_string(), + message: "namaste!".to_string(), + }, + RoomMessage { + user_name: "shruti".to_string(), + message: "yo!".to_string(), + }, + ] + ); + } } diff --git a/client/src/room.rs b/client/src/room.rs index cc27836..d9e2f4b 100644 --- a/client/src/room.rs +++ b/client/src/room.rs @@ -124,7 +124,7 @@ impl RoomMap { /// Looks up the given room name in the map, returning a mutable /// reference to the associated data if found, or an error if not found. - fn get_mut_strict( + pub fn get_mut_strict( &mut self, room_name: &str, ) -> Result<&mut Room, RoomError> {