From 50ea9869616846e5a0448ead8272c397080f36d8 Mon Sep 17 00:00:00 2001 From: "1992414357@qq.com" <1992414357@qq.com> Date: Mon, 21 Apr 2025 06:25:54 +0800 Subject: . --- core/src/message_encoder.rs | 71 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 core/src/message_encoder.rs (limited to 'core/src/message_encoder.rs') diff --git a/core/src/message_encoder.rs b/core/src/message_encoder.rs new file mode 100644 index 0000000..a8575d0 --- /dev/null +++ b/core/src/message_encoder.rs @@ -0,0 +1,71 @@ +use std::io::{Read, Write}; +use bincode::error::{DecodeError, EncodeError}; +use serde::de::DeserializeOwned; +use serde::Serialize; +use crate::messages::{ClientMessage, PlayerMessage, ServerCallbackMessage, ServerMessage}; + +pub trait MessageEncoder: Serialize + DeserializeOwned { + fn encode(&self) -> Result; + fn decode(encode: usize) -> Result + where + Self: Sized; +} + +impl MessageEncoder for PlayerMessage { + fn encode(&self) -> Result { + bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard()) + } + + fn decode(encode: &usize) -> Result { + bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard()) + } +} + +impl MessageEncoder for ServerMessage { + fn encode(&self) -> Result { + bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard()) + } + + fn decode(encode: usize) -> Result { + bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard()) + } +} + +impl MessageEncoder for ClientMessage { + fn encode(&self) -> Result { + bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard()) + } + + fn decode(encode: usize) -> Result { + bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard()) + } +} + +impl MessageEncoder for ServerCallbackMessage { + fn encode(&self) -> Result { + bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard()) + } + + fn decode(encode: usize) -> Result { + bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard()) + } +} + +#[cfg(test)] +mod encoder_tests { + use crate::message_encoder::MessageEncoder; + use crate::messages::PlayerMessage; + + + #[test] + fn test_encode_decode() { + + let msg: String = String::from("Hello, World!"); + + let msg_player = PlayerMessage::Message(msg); + let msg_player_encoded = (&msg_player).encode().expect("Encode failed"); + let msg_player_decoded = PlayerMessage::decode(msg_player_encoded).expect("Decode failed"); + + assert!(msg_player == msg_player_decoded) + } +} \ No newline at end of file -- cgit