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) } }