Files
Gen_Hack-and-Slash-Roguelit…/Server/src/message_dispatcher.rs

49 lines
1.5 KiB
Rust

use prost::Message;
use crate::protocol::{
LoginRequest, LoginResponse, MessageType, RequestResult, SignupRequest, SignupResponse,
};
pub(crate) fn dispatch_message(msg_type: u8, msg: &[u8]) -> Vec<u8> {
let mut buf = Vec::new();
match msg_type {
// Owing to Rust disallows converting an integer to an
// enumeration (yet allows in reverse! ಠ_ಠ), we have to
// use such this way to make this pattern matching works.
//
// This seems not as elegable as what we are expected,
// but it could work well, provided that items in
// `MessageType` doesn't excceed 256.
val if val == MessageType::LoginRequest as u8 => {
let msg = LoginRequest::decode(msg).unwrap();
log::info!("{msg:?}");
LoginResponse {
result: RequestResult::Success.into(),
message: "Successfully logged in!".into(),
}
.encode(&mut buf)
.unwrap();
[vec![MessageType::LoginResponse as u8], buf].concat()
}
val if val == MessageType::SignupRequest as u8 => {
let msg = SignupRequest::decode(msg).unwrap();
log::info!("{msg:?}");
SignupResponse {
result: RequestResult::Success.into(),
message: "Successfully signed up!".into(),
}
.encode(&mut buf)
.unwrap();
[vec![MessageType::SignupResponse as u8], buf].concat()
}
_ => unreachable!(),
}
}