From 9b8daff5ae1b79700564342061d6f1c4ec9a03cf Mon Sep 17 00:00:00 2001 From: Lizzy Fleckenstein Date: Wed, 8 Feb 2023 19:01:20 +0100 Subject: derive serialize for enums --- src/lib.rs | 53 ++++++++++++++++++++++++++++++----------------------- src/to_clt/hud.rs | 4 ++-- 2 files changed, 32 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 6258b34..99bd58a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ pub use enumset; pub use flate2; +pub use paste::paste; #[cfg(feature = "random")] pub use generate_random; @@ -14,13 +15,13 @@ use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; use enumset::{EnumSet, EnumSetType, EnumSetTypeWithRepr}; use mt_data_derive::mt_derive; pub use mt_data_derive::{MtDeserialize, MtSerialize}; -use paste::paste; use std::{ collections::{HashMap, HashSet}, convert::Infallible, fmt, io::{self, Read, Write}, num::TryFromIntError, + ops::Deref, }; use thiserror::Error; @@ -88,11 +89,11 @@ pub trait MtCfg: fn write_len(len: usize, writer: &mut impl Write) -> Result<(), SerializeError> { Ok(Self::try_from(len) .map_err(|e| e.into())? - .mt_serialize::(writer)?) + .mt_serialize::(writer)?) } } -pub type DefaultCfg = u16; +pub type DefCfg = u16; pub trait MtSerialize: Sized { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError>; @@ -161,13 +162,13 @@ pub struct Utf16(pub B); impl MtSerialize for Utf16 { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { - self.0.mt_serialize::(writer) + self.0.mt_serialize::(writer) } } impl MtDeserialize for Utf16 { fn mt_deserialize(reader: &mut impl Read) -> Result { - Ok(Self(B::mt_deserialize::(reader)?)) + Ok(Self(B::mt_deserialize::(reader)?)) } } @@ -266,23 +267,29 @@ impl MtSerialize for () { impl MtSerialize for bool { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { - (*self as u8).mt_serialize::(writer) + (*self as u8).mt_serialize::(writer) } } impl MtSerialize for [T; N] { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { + self.as_slice().mt_serialize::(writer) + } +} + +impl MtSerialize for &[T] { + fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { + C::write_len(self.len(), writer)?; for item in self.iter() { - item.mt_serialize::(writer)?; + item.mt_serialize::(writer)?; } - Ok(()) } } impl> MtSerialize for EnumSet { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { - self.as_repr().mt_serialize::(writer) + self.as_repr().mt_serialize::(writer) } } @@ -297,11 +304,7 @@ impl MtSerialize for Option { impl MtSerialize for Vec { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { - C::write_len(self.len(), writer)?; - for item in self.iter() { - item.mt_serialize::(writer)?; - } - Ok(()) + self.as_slice().mt_serialize::(writer) } } @@ -309,7 +312,7 @@ impl MtSerialize for HashSet { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { C::write_len(self.len(), writer)?; for item in self.iter() { - item.mt_serialize::(writer)?; + item.mt_serialize::(writer)?; } Ok(()) } @@ -323,8 +326,8 @@ where fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { C::write_len(self.len(), writer)?; for (key, value) in self.iter() { - key.mt_serialize::(writer)?; - value.mt_serialize::(writer)?; + key.mt_serialize::(writer)?; + value.mt_serialize::(writer)?; } Ok(()) } @@ -333,17 +336,21 @@ where impl MtSerialize for String { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { if C::utf16() { - // TODO - Err(SerializeError::Unimplemented) + self.encode_utf16() + .collect::>() + .mt_serialize::(writer) } else { - C::write_len(self.len(), writer)?; - writer.write_all(self.as_bytes())?; - - Ok(()) + self.as_bytes().mt_serialize::(writer) } } } +impl MtSerialize for Box { + fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { + self.deref().mt_serialize::(writer) + } +} + mod to_clt; mod to_srv; diff --git a/src/to_clt/hud.rs b/src/to_clt/hud.rs index f0598a9..bdd7de7 100644 --- a/src/to_clt/hud.rs +++ b/src/to_clt/hud.rs @@ -118,9 +118,9 @@ pub struct MinimapModePkt { impl MtSerialize for MinimapModePkt { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { C::write_len(self.modes.len(), writer)?; - self.current.mt_serialize::(writer)?; + self.current.mt_serialize::(writer)?; for item in self.modes.iter() { - item.mt_serialize::(writer)?; + item.mt_serialize::(writer)?; } Ok(()) } -- cgit v1.2.3