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