|
|
@ -8,11 +8,15 @@ use crate::control::Request as ControlRequest; |
|
|
use crate::event::{Event, EventHandler};
|
|
|
use crate::event::{Event, EventHandler};
|
|
|
use crate::handlers::*;
|
|
|
use crate::handlers::*;
|
|
|
use crate::message_handler::MessageHandler;
|
|
|
use crate::message_handler::MessageHandler;
|
|
|
|
|
|
use crate::peer::{PeerEvent, PeerEventHandler};
|
|
|
use crate::room::{RoomEvent, RoomEventHandler};
|
|
|
use crate::room::{RoomEvent, RoomEventHandler};
|
|
|
use crate::user::{UserEvent, UserEventHandler};
|
|
|
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 PeerEventHandler: EventHandler<Event = PeerEvent>;
|
|
|
|
|
|
fn peer_event_handler(&mut self) -> &mut Self::PeerEventHandler;
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
@ -23,11 +27,17 @@ pub trait DispatcherHandlers { |
|
|
/// Default event handlers implementing real behavior.
|
|
|
/// Default event handlers implementing real behavior.
|
|
|
#[derive(Default)]
|
|
|
#[derive(Default)]
|
|
|
pub struct DefaultDispatcherHandlers {
|
|
|
pub struct DefaultDispatcherHandlers {
|
|
|
|
|
|
peer_event_handler: PeerEventHandler,
|
|
|
room_event_handler: RoomEventHandler,
|
|
|
room_event_handler: RoomEventHandler,
|
|
|
user_event_handler: UserEventHandler,
|
|
|
user_event_handler: UserEventHandler,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl DispatcherHandlers for DefaultDispatcherHandlers {
|
|
|
impl DispatcherHandlers for DefaultDispatcherHandlers {
|
|
|
|
|
|
type PeerEventHandler = PeerEventHandler;
|
|
|
|
|
|
fn peer_event_handler(&mut self) -> &mut Self::PeerEventHandler {
|
|
|
|
|
|
&mut self.peer_event_handler
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
type RoomEventHandler = RoomEventHandler;
|
|
|
type RoomEventHandler = RoomEventHandler;
|
|
|
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
|
|
|
@ -74,7 +84,10 @@ impl<H: DispatcherHandlers> Dispatcher<H> { |
|
|
fn dispatch_internal(&mut self, event: Event) -> anyhow::Result<()> {
|
|
|
fn dispatch_internal(&mut self, event: Event) -> anyhow::Result<()> {
|
|
|
match event {
|
|
|
match event {
|
|
|
Event::ServerResponse(ServerResponse::PeerAddressResponse(response)) => {
|
|
|
Event::ServerResponse(ServerResponse::PeerAddressResponse(response)) => {
|
|
|
PeerAddressResponseHandler::default().run(&mut self.context, &response)
|
|
|
|
|
|
|
|
|
self
|
|
|
|
|
|
.handlers
|
|
|
|
|
|
.peer_event_handler()
|
|
|
|
|
|
.handle(&mut self.context, PeerEvent::AddressResponse(response))
|
|
|
}
|
|
|
}
|
|
|
Event::ServerResponse(ServerResponse::PrivilegedUsersResponse(
|
|
|
Event::ServerResponse(ServerResponse::PrivilegedUsersResponse(
|
|
|
response,
|
|
|
response,
|
|
|
@ -104,7 +117,10 @@ impl<H: DispatcherHandlers> Dispatcher<H> { |
|
|
LoginStatusRequestHandler::default().run(&mut self.context, &())
|
|
|
LoginStatusRequestHandler::default().run(&mut self.context, &())
|
|
|
}
|
|
|
}
|
|
|
Event::ControlRequest(ControlRequest::PeerConnectRequest(request)) => {
|
|
|
Event::ControlRequest(ControlRequest::PeerConnectRequest(request)) => {
|
|
|
PeerConnectRequestHandler::default().run(&mut self.context, &request)
|
|
|
|
|
|
|
|
|
self
|
|
|
|
|
|
.handlers
|
|
|
|
|
|
.peer_event_handler()
|
|
|
|
|
|
.handle(&mut self.context, PeerEvent::ConnectRequest(request))
|
|
|
}
|
|
|
}
|
|
|
Event::ControlRequest(ControlRequest::RoomListRequest) => self
|
|
|
Event::ControlRequest(ControlRequest::RoomListRequest) => self
|
|
|
.handlers
|
|
|
.handlers
|
|
|
@ -149,6 +165,7 @@ mod tests { |
|
|
use crate::context::{Context, ContextBundle};
|
|
|
use crate::context::{Context, ContextBundle};
|
|
|
use crate::control;
|
|
|
use crate::control;
|
|
|
use crate::event::{Event, EventHandler};
|
|
|
use crate::event::{Event, EventHandler};
|
|
|
|
|
|
use crate::peer::PeerEvent;
|
|
|
use crate::room::RoomEvent;
|
|
|
use crate::room::RoomEvent;
|
|
|
use crate::user::UserEvent;
|
|
|
use crate::user::UserEvent;
|
|
|
|
|
|
|
|
|
@ -184,6 +201,7 @@ mod tests { |
|
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
#[derive(Default)]
|
|
|
struct FakeDispatcherHandlers {
|
|
|
struct FakeDispatcherHandlers {
|
|
|
|
|
|
peer_event_handler: FakeEventHandler<PeerEvent>,
|
|
|
room_event_handler: FakeEventHandler<RoomEvent>,
|
|
|
room_event_handler: FakeEventHandler<RoomEvent>,
|
|
|
user_event_handler: FakeEventHandler<UserEvent>,
|
|
|
user_event_handler: FakeEventHandler<UserEvent>,
|
|
|
}
|
|
|
}
|
|
|
@ -191,12 +209,18 @@ mod tests { |
|
|
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.peer_event_handler.events.is_empty()
|
|
|
|
|
|
|| !self.room_event_handler.events.is_empty()
|
|
|
|| !self.user_event_handler.events.is_empty()
|
|
|
|| !self.user_event_handler.events.is_empty()
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl DispatcherHandlers for FakeDispatcherHandlers {
|
|
|
impl DispatcherHandlers for FakeDispatcherHandlers {
|
|
|
|
|
|
type PeerEventHandler = FakeEventHandler<PeerEvent>;
|
|
|
|
|
|
fn peer_event_handler(&mut self) -> &mut Self::PeerEventHandler {
|
|
|
|
|
|
&mut self.peer_event_handler
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
type RoomEventHandler = FakeEventHandler<RoomEvent>;
|
|
|
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
|
|
|
|