aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/message_encoder.rs48
-rw-r--r--core/src/messages.rs30
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