use crate::constants::{BINCODE_CONFIG, BINCODE_CONVERT_FAILED}; use crate::messages::{ClientMessage, PlayerMessage, ServerCallbackMessage, ServerMessage}; use std::fmt::Debug; use bincode::{Decode, Encode}; pub trait LazyMessageEncoder> { fn err_result_decode () -> Message; fn err_result_encode () -> Vec { BINCODE_CONVERT_FAILED } fn encode (&self) -> Vec where Self : Encode { bincode::encode_to_vec(self, BINCODE_CONFIG) .unwrap_or_else(|_| Self::err_result_encode()) } fn decode (encoded : Vec) -> Message { match bincode::decode_from_slice(&encoded[..], BINCODE_CONFIG) { Ok((decoded, _)) => decoded, Err(_) => Self::err_result_decode() } } } impl LazyMessageEncoder for PlayerMessage { fn err_result_decode() -> PlayerMessage { PlayerMessage::Error } } impl LazyMessageEncoder for ServerMessage { fn err_result_decode() -> ServerMessage { ServerMessage::Error } } impl LazyMessageEncoder for ClientMessage { fn err_result_decode() -> ClientMessage { ClientMessage::Error } } impl LazyMessageEncoder for ServerCallbackMessage { fn err_result_decode() -> ServerCallbackMessage { ServerCallbackMessage::Error } }