Browse Source

Store room messages as we receive them.

wip
Titouan Rigoudy 4 years ago
parent
commit
f347c81c24
2 changed files with 69 additions and 3 deletions
  1. +68
    -2
      client/src/handlers/room_message_response_handler.rs
  2. +1
    -1
      client/src/room.rs

+ 68
- 2
client/src/handlers/room_message_response_handler.rs View File

@ -1,13 +1,29 @@
use anyhow::Context as AnyhowContext; use anyhow::Context as AnyhowContext;
use log::warn;
use solstice_proto::server; use solstice_proto::server;
use crate::context::Context; use crate::context::Context;
use crate::control; use crate::control;
use crate::message_handler::MessageHandler; use crate::message_handler::MessageHandler;
use crate::room::{Message as RoomMessage, RoomMap};
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct RoomMessageResponseHandler; 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 { impl MessageHandler for RoomMessageResponseHandler {
type Message = server::RoomMessageResponse; type Message = server::RoomMessageResponse;
@ -16,7 +32,11 @@ impl MessageHandler for RoomMessageResponseHandler {
context: &Context, context: &Context,
message: &server::RoomMessageResponse, message: &server::RoomMessageResponse,
) -> anyhow::Result<()> { ) -> 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 context
.control_response_tx .control_response_tx
.blocking_send(control::Response::RoomMessageResponse( .blocking_send(control::Response::RoomMessageResponse(
@ -39,9 +59,10 @@ impl MessageHandler for RoomMessageResponseHandler {
mod tests { mod tests {
use solstice_proto::server; use solstice_proto::server;
use crate::context::ContextBundle;
use crate::context::{ContextBundle, ContextOptions};
use crate::control; use crate::control;
use crate::message_handler::MessageHandler; use crate::message_handler::MessageHandler;
use crate::room::{Message as RoomMessage, Room, Visibility};
use super::RoomMessageResponseHandler; 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(),
},
]
);
}
} }

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

@ -124,7 +124,7 @@ impl RoomMap {
/// Looks up the given room name in the map, returning a mutable /// 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. /// reference to the associated data if found, or an error if not found.
fn get_mut_strict(
pub fn get_mut_strict(
&mut self, &mut self,
room_name: &str, room_name: &str,
) -> Result<&mut Room, RoomError> { ) -> Result<&mut Room, RoomError> {


Loading…
Cancel
Save