diff options
| author | 1992414357@qq.com <1992414357@qq.com> | 2025-04-21 06:25:54 +0800 |
|---|---|---|
| committer | 1992414357@qq.com <1992414357@qq.com> | 2025-04-21 06:25:54 +0800 |
| commit | 50ea9869616846e5a0448ead8272c397080f36d8 (patch) | |
| tree | 5f2ec829ecf48441a6d33f4160909dc02ddf83bf /core/src/message_encoder.rs | |
| parent | d72d700c84794ca420035ceb9c294563f3f9c048 (diff) | |
.
Diffstat (limited to 'core/src/message_encoder.rs')
| -rw-r--r-- | core/src/message_encoder.rs | 71 |
1 files changed, 71 insertions, 0 deletions
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<usize, EncodeError>; + fn decode(encode: usize) -> Result<Self, DecodeError> + where + Self: Sized; +} + +impl MessageEncoder for PlayerMessage { + fn encode(&self) -> Result<usize, EncodeError> { + bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard()) + } + + fn decode(encode: &usize) -> Result<Self, DecodeError> { + bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard()) + } +} + +impl MessageEncoder for ServerMessage { + fn encode(&self) -> Result<usize, EncodeError> { + bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard()) + } + + fn decode(encode: usize) -> Result<Self, DecodeError> { + bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard()) + } +} + +impl MessageEncoder for ClientMessage { + fn encode(&self) -> Result<usize, EncodeError> { + bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard()) + } + + fn decode(encode: usize) -> Result<Self, DecodeError> { + bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard()) + } +} + +impl MessageEncoder for ServerCallbackMessage { + fn encode(&self) -> Result<usize, EncodeError> { + bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard()) + } + + fn decode(encode: usize) -> Result<Self, DecodeError> { + 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 |
