use prost::Message; use crate::protocol::{ LoginRequest, LoginResponse, MessageType, RequestResult, SignupRequest, SignupResponse, }; pub(crate) fn dispatch_message(msg_type: u8, msg: &[u8]) -> Vec { 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!(), } }