diff options
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/message_encoder.rs | 48 | ||||
| -rw-r--r-- | core/src/messages.rs | 30 |
2 files changed, 65 insertions, 13 deletions
diff --git a/core/src/message_encoder.rs b/core/src/message_encoder.rs index e6e10b2..0ef7fc8 100644 --- a/core/src/message_encoder.rs +++ b/core/src/message_encoder.rs @@ -1,7 +1,47 @@ -use crate::messages::PlayerMessage; +use crate::constants::{BINCODE_CONFIG, BINCODE_CONVERT_FAILED}; +use crate::messages::{ClientMessage, PlayerMessage, ServerCallbackMessage, ServerMessage}; +use std::fmt::Debug; +use bincode::{Decode, Encode}; -impl PlayerMessage { - pub fn encode (&self) { - // +pub trait LazyMessageEncoder<Message: Encode + Decode<()>> { + fn err_result_decode () -> Message; + fn err_result_encode () -> Vec<u8> { + BINCODE_CONVERT_FAILED + } + + fn encode (&self) -> Vec<u8> where Self : Encode { + bincode::encode_to_vec(self, BINCODE_CONFIG) + .unwrap_or_else(|_| Self::err_result_encode()) + } + + fn decode (encoded : Vec<u8>) -> Message { + match bincode::decode_from_slice(&encoded[..], BINCODE_CONFIG) { + Ok((decoded, _)) => decoded, + Err(_) => Self::err_result_decode() + } + } +} + +impl LazyMessageEncoder<PlayerMessage> for PlayerMessage { + fn err_result_decode() -> PlayerMessage { + PlayerMessage::Error + } +} + +impl LazyMessageEncoder<ServerMessage> for ServerMessage { + fn err_result_decode() -> ServerMessage { + ServerMessage::Error + } +} + +impl LazyMessageEncoder<ClientMessage> for ClientMessage { + fn err_result_decode() -> ClientMessage { + ClientMessage::Error + } +} + +impl LazyMessageEncoder<ServerCallbackMessage> for ServerCallbackMessage { + fn err_result_decode() -> ServerCallbackMessage { + ServerCallbackMessage::Error } }
\ No newline at end of file diff --git a/core/src/messages.rs b/core/src/messages.rs index 2ae8328..b17faeb 100644 --- a/core/src/messages.rs +++ b/core/src/messages.rs @@ -1,10 +1,10 @@ use std::time::Duration; -use serde::{Deserialize, Serialize}; +use bincode::{Decode, Encode}; use crate::player::player_info::PlayerInfo; /// # 玩家消息 /// 玩家 --> 服务器 -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Encode, Decode, PartialEq, Debug)] pub enum PlayerMessage { /// 消息:发送字符串,服务端无需回复 Message(String), @@ -22,12 +22,15 @@ pub enum PlayerMessage { /// u8:轴向代号 /// f64:X 轴向值 (0 - 1) /// f64:Y 轴向值 (0 - 1) - Axis(u8, (f64, f64)) + Axis(u8, (f64, f64)), + + /// 错误消息 + Error } /// # 服务器消息 /// 服务器 --> 玩家 -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Encode, Decode, PartialEq, Debug)] pub enum ServerMessage { /// 命令:发送字符串,客户端处理 @@ -41,12 +44,15 @@ pub enum ServerMessage { /// 踢出:发送踢出指令,以便让客户端明白自己的掉线是因为被踢出 /// “杀人还要诛心!!!好可怕啊!” - Kick + Kick, + + /// 错误消息 + Error } /// # 客户端消息 /// 客户端 --> 服务器 -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Encode, Decode, PartialEq, Debug)] pub enum ClientMessage { /// 连接请求,将和服务端建立连接,并通知服务器将要建立连接的玩家 @@ -59,12 +65,15 @@ pub enum ClientMessage { RequestSkin, /// 客户端准备就绪 - Ready + Ready, + + /// 错误消息 + Error } /// # 服务器回调消息 /// 服务器 --> 客户端 -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Encode, Decode, PartialEq, Debug)] pub enum ServerCallbackMessage { /// 拒绝:发送消息已通知客户端请求被拒绝 @@ -74,5 +83,8 @@ pub enum ServerCallbackMessage { Accept, /// 欢迎:客户端准备完成后,服务端发送 Welcome 以允许客户端以玩家加入游戏 - Welcome + Welcome, + + /// 错误消息 + Error }
\ No newline at end of file |
