|
|
@ -9,17 +9,22 @@ use crate::event::{Event, EventHandler}; |
|
|
use crate::handlers::*;
|
|
|
use crate::handlers::*;
|
|
|
use crate::message_handler::MessageHandler;
|
|
|
use crate::message_handler::MessageHandler;
|
|
|
use crate::room::{RoomEvent, RoomEventHandler};
|
|
|
use crate::room::{RoomEvent, RoomEventHandler};
|
|
|
|
|
|
use crate::user::{UserEvent, UserEventHandler};
|
|
|
|
|
|
|
|
|
/// Subsystem event handlers to which the `Dispatcher` dispatches events.
|
|
|
/// Subsystem event handlers to which the `Dispatcher` dispatches events.
|
|
|
pub trait DispatcherHandlers {
|
|
|
pub trait DispatcherHandlers {
|
|
|
type RoomEventHandler: EventHandler<Event = RoomEvent>;
|
|
|
type RoomEventHandler: EventHandler<Event = RoomEvent>;
|
|
|
fn room_event_handler(&mut self) -> &mut Self::RoomEventHandler;
|
|
|
fn room_event_handler(&mut self) -> &mut Self::RoomEventHandler;
|
|
|
|
|
|
|
|
|
|
|
|
type UserEventHandler: EventHandler<Event = UserEvent>;
|
|
|
|
|
|
fn user_event_handler(&mut self) -> &mut Self::UserEventHandler;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/// Default event handlers implementing real behavior.
|
|
|
/// Default event handlers implementing real behavior.
|
|
|
#[derive(Default)]
|
|
|
#[derive(Default)]
|
|
|
pub struct DefaultDispatcherHandlers {
|
|
|
pub struct DefaultDispatcherHandlers {
|
|
|
room_event_handler: RoomEventHandler,
|
|
|
room_event_handler: RoomEventHandler,
|
|
|
|
|
|
user_event_handler: UserEventHandler,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl DispatcherHandlers for DefaultDispatcherHandlers {
|
|
|
impl DispatcherHandlers for DefaultDispatcherHandlers {
|
|
|
@ -27,6 +32,11 @@ impl DispatcherHandlers for DefaultDispatcherHandlers { |
|
|
fn room_event_handler(&mut self) -> &mut Self::RoomEventHandler {
|
|
|
fn room_event_handler(&mut self) -> &mut Self::RoomEventHandler {
|
|
|
&mut self.room_event_handler
|
|
|
&mut self.room_event_handler
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type UserEventHandler = UserEventHandler;
|
|
|
|
|
|
fn user_event_handler(&mut self) -> &mut Self::UserEventHandler {
|
|
|
|
|
|
&mut self.user_event_handler
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/// Parts that make up a `Dispatcher`.
|
|
|
/// Parts that make up a `Dispatcher`.
|
|
|
@ -68,8 +78,10 @@ impl<H: DispatcherHandlers> Dispatcher<H> { |
|
|
}
|
|
|
}
|
|
|
Event::ServerResponse(ServerResponse::PrivilegedUsersResponse(
|
|
|
Event::ServerResponse(ServerResponse::PrivilegedUsersResponse(
|
|
|
response,
|
|
|
response,
|
|
|
)) => PrivilegedUsersResponseHandler::default()
|
|
|
|
|
|
.run(&mut self.context, &response),
|
|
|
|
|
|
|
|
|
)) => self.handlers.user_event_handler().handle(
|
|
|
|
|
|
&mut self.context,
|
|
|
|
|
|
UserEvent::PrivilegedUsersResponse(response),
|
|
|
|
|
|
),
|
|
|
Event::ServerResponse(ServerResponse::RoomJoinResponse(response)) => self
|
|
|
Event::ServerResponse(ServerResponse::RoomJoinResponse(response)) => self
|
|
|
.handlers
|
|
|
.handlers
|
|
|
.room_event_handler()
|
|
|
.room_event_handler()
|
|
|
@ -108,9 +120,10 @@ impl<H: DispatcherHandlers> Dispatcher<H> { |
|
|
.handlers
|
|
|
.handlers
|
|
|
.room_event_handler()
|
|
|
.room_event_handler()
|
|
|
.handle(&mut self.context, RoomEvent::JoinRequest(room_name)),
|
|
|
.handle(&mut self.context, RoomEvent::JoinRequest(room_name)),
|
|
|
Event::ControlRequest(ControlRequest::UserListRequest) => {
|
|
|
|
|
|
UserListRequestHandler::default().run(&mut self.context, &())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Event::ControlRequest(ControlRequest::UserListRequest) => self
|
|
|
|
|
|
.handlers
|
|
|
|
|
|
.user_event_handler()
|
|
|
|
|
|
.handle(&mut self.context, UserEvent::ListRequest),
|
|
|
Event::ControlRequest(request) => {
|
|
|
Event::ControlRequest(request) => {
|
|
|
warn!("Unhandled control request: {:?}", request);
|
|
|
warn!("Unhandled control request: {:?}", request);
|
|
|
Ok(())
|
|
|
Ok(())
|
|
|
@ -133,30 +146,66 @@ mod tests { |
|
|
|
|
|
|
|
|
use solstice_proto::server;
|
|
|
use solstice_proto::server;
|
|
|
|
|
|
|
|
|
use crate::context::ContextBundle;
|
|
|
|
|
|
|
|
|
use crate::context::{Context, ContextBundle};
|
|
|
use crate::control;
|
|
|
use crate::control;
|
|
|
use crate::dispatcher::Event;
|
|
|
|
|
|
use crate::room::testing::FakeRoomEventHandler;
|
|
|
|
|
|
|
|
|
use crate::event::{Event, EventHandler};
|
|
|
|
|
|
use crate::room::RoomEvent;
|
|
|
|
|
|
use crate::user::UserEvent;
|
|
|
|
|
|
|
|
|
|
|
|
use super::{Dispatcher, DispatcherHandlers, DispatcherParts};
|
|
|
|
|
|
|
|
|
|
|
|
/// A fake event handler that just records the events passed to it.
|
|
|
|
|
|
struct FakeEventHandler<E> {
|
|
|
|
|
|
pub events: Vec<E>,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// `Default` derivation seems not to work with generic vectors? Implementing
|
|
|
|
|
|
// it by hand works just fine, however.
|
|
|
|
|
|
impl<E> Default for FakeEventHandler<E> {
|
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
|
Self {
|
|
|
|
|
|
events: Vec::default(),
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
impl<E> EventHandler for FakeEventHandler<E> {
|
|
|
|
|
|
type Event = E;
|
|
|
|
|
|
|
|
|
|
|
|
fn handle(
|
|
|
|
|
|
&mut self,
|
|
|
|
|
|
_context: &mut Context,
|
|
|
|
|
|
event: E,
|
|
|
|
|
|
) -> anyhow::Result<()> {
|
|
|
|
|
|
self.events.push(event);
|
|
|
|
|
|
Ok(())
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
#[derive(Default)]
|
|
|
struct FakeDispatcherHandlers {
|
|
|
struct FakeDispatcherHandlers {
|
|
|
room_event_handler: FakeRoomEventHandler,
|
|
|
|
|
|
|
|
|
room_event_handler: FakeEventHandler<RoomEvent>,
|
|
|
|
|
|
user_event_handler: FakeEventHandler<UserEvent>,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl FakeDispatcherHandlers {
|
|
|
impl FakeDispatcherHandlers {
|
|
|
// Defined here for better maintainability as new handlers are added.
|
|
|
// Defined here for better maintainability as new handlers are added.
|
|
|
fn has_events(&self) -> bool {
|
|
|
fn has_events(&self) -> bool {
|
|
|
!self.room_event_handler.events.is_empty()
|
|
|
!self.room_event_handler.events.is_empty()
|
|
|
|
|
|
|| !self.user_event_handler.events.is_empty()
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl DispatcherHandlers for FakeDispatcherHandlers {
|
|
|
impl DispatcherHandlers for FakeDispatcherHandlers {
|
|
|
type RoomEventHandler = FakeRoomEventHandler;
|
|
|
|
|
|
|
|
|
type RoomEventHandler = FakeEventHandler<RoomEvent>;
|
|
|
fn room_event_handler(&mut self) -> &mut Self::RoomEventHandler {
|
|
|
fn room_event_handler(&mut self) -> &mut Self::RoomEventHandler {
|
|
|
&mut self.room_event_handler
|
|
|
&mut self.room_event_handler
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type UserEventHandler = FakeEventHandler<UserEvent>;
|
|
|
|
|
|
fn user_event_handler(&mut self) -> &mut Self::UserEventHandler {
|
|
|
|
|
|
&mut self.user_event_handler
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/// Dispatches `event` to fake handlers using a new `Dispatcher` and
|
|
|
/// Dispatches `event` to fake handlers using a new `Dispatcher` and
|
|
|
@ -222,9 +271,12 @@ mod tests { |
|
|
users: vec!["foo".to_string(), "bar".to_string(), "baz".to_string()],
|
|
|
users: vec!["foo".to_string(), "bar".to_string(), "baz".to_string()],
|
|
|
};
|
|
|
};
|
|
|
|
|
|
|
|
|
let _handlers = dispatch(Event::ServerResponse(response.into()));
|
|
|
|
|
|
|
|
|
let handlers = dispatch(Event::ServerResponse(response.clone().into()));
|
|
|
|
|
|
|
|
|
// TODO: Check that event is dispatched to a new user event handler.
|
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
|
|
handlers.user_event_handler.events,
|
|
|
|
|
|
&[UserEvent::PrivilegedUsersResponse(response)],
|
|
|
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
#[test]
|
|
|
@ -318,8 +370,11 @@ mod tests { |
|
|
fn dispatches_user_list_request() {
|
|
|
fn dispatches_user_list_request() {
|
|
|
let request = control::Request::UserListRequest;
|
|
|
let request = control::Request::UserListRequest;
|
|
|
|
|
|
|
|
|
let _handlers = dispatch(request.into());
|
|
|
|
|
|
|
|
|
let handlers = dispatch(request.into());
|
|
|
|
|
|
|
|
|
// TODO: Check that event is dispatched to a new user event handler.
|
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
|
|
handlers.user_event_handler.events,
|
|
|
|
|
|
&[UserEvent::ListRequest],
|
|
|
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|