Browse Source

Dispatch to user event handler.

main
Titouan Rigoudy 2 years ago
parent
commit
dfaef89728
3 changed files with 90 additions and 45 deletions
  1. +70
    -15
      client/src/dispatcher.rs
  2. +0
    -26
      client/src/room/event.rs
  3. +20
    -4
      client/src/user/event.rs

+ 70
- 15
client/src/dispatcher.rs View File

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

+ 0
- 26
client/src/room/event.rs View File

@ -187,32 +187,6 @@ impl EventHandler for RoomEventHandler {
} }
} }
#[cfg(test)]
pub mod testing {
use crate::context::Context;
use crate::event::EventHandler;
use super::RoomEvent;
#[derive(Default)]
pub struct FakeRoomEventHandler {
pub events: Vec<RoomEvent>,
}
impl EventHandler for FakeRoomEventHandler {
type Event = RoomEvent;
fn handle(
&mut self,
_context: &mut Context,
event: Self::Event,
) -> anyhow::Result<()> {
self.events.push(event);
Ok(())
}
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::cmp::Ordering; use std::cmp::Ordering;


+ 20
- 4
client/src/user/event.rs View File

@ -1,12 +1,21 @@
//! This module defines events affecting the user module and their handling. //! This module defines events affecting the user module and their handling.
use solstice_proto::server;
use crate::context::Context; use crate::context::Context;
use crate::event::EventHandler; use crate::event::EventHandler;
use crate::handlers::{PrivilegedUsersResponseHandler, UserListRequestHandler};
use crate::message_handler::MessageHandler;
/// An event affecting the user module. /// An event affecting the user module.
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
pub enum UserEvent {}
pub enum UserEvent {
ListRequest,
PrivilegedUsersResponse(server::PrivilegedUsersResponse),
}
/// The default user event handler.
#[derive(Debug, Default)]
pub struct UserEventHandler; pub struct UserEventHandler;
impl EventHandler for UserEventHandler { impl EventHandler for UserEventHandler {
@ -14,9 +23,16 @@ impl EventHandler for UserEventHandler {
fn handle( fn handle(
&mut self, &mut self,
_context: &mut Context,
_event: Self::Event,
context: &mut Context,
event: Self::Event,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
Ok(())
match event {
UserEvent::ListRequest => {
UserListRequestHandler::default().run(context, &())
}
UserEvent::PrivilegedUsersResponse(response) => {
PrivilegedUsersResponseHandler::default().run(context, &response)
}
}
} }
} }

Loading…
Cancel
Save