Browse Source

Rework MessageHandler to use associated types.

wip
Titouan Rigoudy 4 years ago
parent
commit
94d7716ed8
6 changed files with 40 additions and 27 deletions
  1. +4
    -4
      client/src/dispatcher.rs
  2. +7
    -5
      client/src/handlers/room_list_request_handler.rs
  3. +7
    -5
      client/src/handlers/room_message_request_handler.rs
  4. +4
    -4
      client/src/handlers/set_privileged_users_handler.rs
  5. +9
    -6
      client/src/handlers/set_room_list_handler.rs
  6. +9
    -3
      client/src/message_handler.rs

+ 4
- 4
client/src/dispatcher.rs View File

@ -35,15 +35,15 @@ impl From<ControlRequest> for Message {
/// Pairs together a message and its handler as chosen by the dispatcher. /// Pairs together a message and its handler as chosen by the dispatcher.
/// Implements Job so as to be scheduled on an executor. /// Implements Job so as to be scheduled on an executor.
struct DispatchedMessage<M, H> {
struct DispatchedMessage<H, M> {
message: M, message: M,
handler: H, handler: H,
} }
impl<M, H> Job for DispatchedMessage<M, H>
impl<H> Job for DispatchedMessage<H, <H as MessageHandler>::Message>
where where
M: Debug + Send,
H: MessageHandler<M> + Send,
H: MessageHandler + Send,
<H as MessageHandler>::Message: Debug + Send,
{ {
fn execute(self: Box<Self>, context: &Context) { fn execute(self: Box<Self>, context: &Context) {
if let Err(error) = self.handler.run(context, &self.message) { if let Err(error) = self.handler.run(context, &self.message) {


+ 7
- 5
client/src/handlers/room_list_request_handler.rs View File

@ -1,5 +1,4 @@
use std::io;
use anyhow::Context as AnyhowContext;
use solstice_proto::ServerRequest; use solstice_proto::ServerRequest;
use crate::context::Context; use crate::context::Context;
@ -8,12 +7,15 @@ use crate::message_handler::MessageHandler;
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct RoomListRequestHandler; pub struct RoomListRequestHandler;
impl MessageHandler<()> for RoomListRequestHandler {
fn run(self, context: &Context, message: &()) -> io::Result<()> {
impl MessageHandler for RoomListRequestHandler {
type Message = ();
fn run(self, context: &Context, _message: &()) -> anyhow::Result<()> {
// TODO: Send `RoomListResponse` back over socket. // TODO: Send `RoomListResponse` back over socket.
context context
.server_request_tx .server_request_tx
.blocking_send(ServerRequest::RoomListRequest);
.blocking_send(ServerRequest::RoomListRequest)
.context("sending server request")?;
Ok(()) Ok(())
} }


+ 7
- 5
client/src/handlers/room_message_request_handler.rs View File

@ -1,5 +1,4 @@
use std::io;
use anyhow::Context as AnyhowContext;
use solstice_proto::server; use solstice_proto::server;
use solstice_proto::ServerRequest; use solstice_proto::ServerRequest;
@ -10,12 +9,14 @@ use crate::message_handler::MessageHandler;
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct RoomMessageRequestHandler; pub struct RoomMessageRequestHandler;
impl MessageHandler<control::RoomMessageRequest> for RoomMessageRequestHandler {
impl MessageHandler for RoomMessageRequestHandler {
type Message = control::RoomMessageRequest;
fn run( fn run(
self, self,
context: &Context, context: &Context,
message: &control::RoomMessageRequest, message: &control::RoomMessageRequest,
) -> io::Result<()> {
) -> anyhow::Result<()> {
context context
.server_request_tx .server_request_tx
.blocking_send(ServerRequest::RoomMessageRequest( .blocking_send(ServerRequest::RoomMessageRequest(
@ -23,7 +24,8 @@ impl MessageHandler<control::RoomMessageRequest> for RoomMessageRequestHandler {
room_name: message.room_name.clone(), room_name: message.room_name.clone(),
message: message.message.clone(), message: message.message.clone(),
}, },
));
))
.context("sending server request")?;
Ok(()) Ok(())
} }


+ 4
- 4
client/src/handlers/set_privileged_users_handler.rs View File

@ -1,5 +1,3 @@
use std::io;
use solstice_proto::server::PrivilegedUsersResponse; use solstice_proto::server::PrivilegedUsersResponse;
use crate::context::Context; use crate::context::Context;
@ -8,12 +6,14 @@ use crate::message_handler::MessageHandler;
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct SetPrivilegedUsersHandler; pub struct SetPrivilegedUsersHandler;
impl MessageHandler<PrivilegedUsersResponse> for SetPrivilegedUsersHandler {
impl MessageHandler for SetPrivilegedUsersHandler {
type Message = PrivilegedUsersResponse;
fn run( fn run(
self, self,
context: &Context, context: &Context,
message: &PrivilegedUsersResponse, message: &PrivilegedUsersResponse,
) -> io::Result<()> {
) -> anyhow::Result<()> {
let users = message.users.clone(); let users = message.users.clone();
context.state.lock().users.set_all_privileged(users); context.state.lock().users.set_all_privileged(users);
Ok(()) Ok(())


+ 9
- 6
client/src/handlers/set_room_list_handler.rs View File

@ -1,5 +1,4 @@
use std::io;
use anyhow::Context as AnyhowContext;
use solstice_proto::server::RoomListResponse; use solstice_proto::server::RoomListResponse;
use crate::context::Context; use crate::context::Context;
@ -9,12 +8,14 @@ use crate::message_handler::MessageHandler;
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct SetRoomListHandler; pub struct SetRoomListHandler;
impl MessageHandler<RoomListResponse> for SetRoomListHandler {
impl MessageHandler for SetRoomListHandler {
type Message = RoomListResponse;
fn run( fn run(
self, self,
context: &Context, context: &Context,
message: &RoomListResponse, message: &RoomListResponse,
) -> io::Result<()> {
) -> anyhow::Result<()> {
let response = (*message).clone(); let response = (*message).clone();
{ {
let mut guard = context.state.lock(); let mut guard = context.state.lock();
@ -27,8 +28,10 @@ impl MessageHandler<RoomListResponse> for SetRoomListHandler {
rooms, rooms,
}); });
// TODO: decide what to do with errors here.
context.control_response_tx.blocking_send(control_response);
context
.control_response_tx
.blocking_send(control_response)
.context("sending control response")?;
} }
Ok(()) Ok(())
} }


+ 9
- 3
client/src/message_handler.rs View File

@ -1,4 +1,4 @@
use std::io;
use std::fmt::Debug;
use crate::context::Context; use crate::context::Context;
@ -6,9 +6,15 @@ use crate::context::Context;
/// ///
/// Message types are mapped to handler types by Dispatcher. /// Message types are mapped to handler types by Dispatcher.
/// This trait is intended to allow composing handler logic. /// This trait is intended to allow composing handler logic.
pub trait MessageHandler<Message> {
pub trait MessageHandler: Debug {
type Message;
/// Attempts to handle the given message against the given context. /// Attempts to handle the given message against the given context.
fn run(self, context: &Context, message: &Message) -> io::Result<()>;
fn run(
self,
context: &Context,
message: &Self::Message,
) -> anyhow::Result<()>;
/// Returns the name of this handler type. /// Returns the name of this handler type.
fn name() -> String; fn name() -> String;


Loading…
Cancel
Save