|
|
|
@ -14,6 +14,12 @@ pub enum Message { |
|
|
|
ServerResponse(ServerResponse),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<ServerResponse> for Message {
|
|
|
|
fn from(response: ServerResponse) -> Self {
|
|
|
|
Self::ServerResponse(response)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Pairs together a message and its handler as chosen by the dispatcher.
|
|
|
|
/// Implements Job so as to be scheduled on an executor.
|
|
|
|
struct DispatchedMessage<M, H> {
|
|
|
|
@ -21,12 +27,6 @@ struct DispatchedMessage<M, H> { |
|
|
|
handler: H,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<M, H> DispatchedMessage<M, H> {
|
|
|
|
fn new(message: M, handler: H) -> Self {
|
|
|
|
Self { message, handler }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<M, H> Job for DispatchedMessage<M, H>
|
|
|
|
where
|
|
|
|
M: Debug + Send,
|
|
|
|
@ -57,14 +57,17 @@ impl Dispatcher { |
|
|
|
pub fn dispatch(&self, message: Message) -> Box<dyn Job> {
|
|
|
|
match message {
|
|
|
|
Message::ServerResponse(ServerResponse::LoginResponse(response)) => {
|
|
|
|
Box::new(DispatchedMessage::new(response, LoginHandler::default()))
|
|
|
|
Box::new(DispatchedMessage {
|
|
|
|
message: response,
|
|
|
|
handler: LoginHandler::default(),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
Message::ServerResponse(ServerResponse::PrivilegedUsersResponse(
|
|
|
|
response,
|
|
|
|
)) => Box::new(DispatchedMessage::new(
|
|
|
|
response,
|
|
|
|
SetPrivilegedUsersHandler::default(),
|
|
|
|
)),
|
|
|
|
)) => Box::new(DispatchedMessage {
|
|
|
|
message: response,
|
|
|
|
handler: SetPrivilegedUsersHandler::default(),
|
|
|
|
}),
|
|
|
|
_ => panic!("Unimplemented"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -72,27 +75,27 @@ impl Dispatcher { |
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use solstice_proto::server;
|
|
|
|
use solstice_proto::server::{self, ServerResponse};
|
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
fn into_message<T: Into<ServerResponse>>(t: T) -> Message {
|
|
|
|
t.into().into()
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn dispatcher_privileged_users_response() {
|
|
|
|
Dispatcher::new().dispatch(Message::ServerResponse(
|
|
|
|
server::ServerResponse::PrivilegedUsersResponse(
|
|
|
|
server::PrivilegedUsersResponse {
|
|
|
|
users: vec!["foo".to_string(), "bar".to_string(), "baz".to_string()],
|
|
|
|
},
|
|
|
|
),
|
|
|
|
));
|
|
|
|
Dispatcher::new().dispatch(into_message(server::PrivilegedUsersResponse {
|
|
|
|
users: vec!["foo".to_string(), "bar".to_string(), "baz".to_string()],
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn dispatcher_login_response() {
|
|
|
|
Dispatcher::new().dispatch(Message::ServerResponse(
|
|
|
|
server::ServerResponse::LoginResponse(server::LoginResponse::LoginFail {
|
|
|
|
Dispatcher::new().dispatch(into_message(
|
|
|
|
server::LoginResponse::LoginFail {
|
|
|
|
reason: "bleep bloop".to_string(),
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
));
|
|
|
|
}
|
|
|
|
}
|