(tools, client, server) feat: Complete ProtoBuf message transmission with both TCP and UDP
This commit is contained in:
48
Server/src/message_dispatcher.rs
Normal file
48
Server/src/message_dispatcher.rs
Normal file
@ -0,0 +1,48 @@
|
||||
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!(),
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user