49 lines
1.5 KiB
Rust
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!(),
|
|
}
|
|
}
|