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