From: Lizzy Fleckenstein Date: Mon, 13 Feb 2023 16:02:15 +0000 (+0100) Subject: Add Inner type to MtCfg X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=ac349f580201beef6bede6e8073f5e632df78250;p=mt_ser.git Add Inner type to MtCfg --- diff --git a/src/lib.rs b/src/lib.rs index 4eaf119..3a84f78 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -136,6 +136,7 @@ pub trait MtLen { pub trait MtCfg { type Len: MtLen; + type Inner: MtCfg; fn utf16() -> bool { false @@ -180,6 +181,7 @@ trait MtCfgLen: impl MtCfg for T { type Len = usize; + type Inner = DefCfg; fn write_len(len: usize, writer: &mut impl Write) -> Result<(), SerializeError> { Self::try_from(len) @@ -203,6 +205,7 @@ pub type DefCfg = u16; impl MtCfg for () { type Len = (); + type Inner = DefCfg; fn write_len(_len: usize, _writer: &mut impl Write) -> Result<(), SerializeError> { Ok(()) @@ -233,6 +236,7 @@ pub struct Utf16(pub B); impl MtCfg for Utf16 { type Len = B::Len; + type Inner = B::Inner; fn utf16() -> bool { true @@ -247,6 +251,19 @@ impl MtCfg for Utf16 { } } +impl MtCfg for (A, B) { + type Len = A::Len; + type Inner = B; + + fn write_len(len: usize, writer: &mut impl Write) -> Result<(), SerializeError> { + A::write_len(len, writer) + } + + fn read_len(reader: &mut impl Read) -> Result { + A::read_len(reader) + } +} + impl MtSerialize for u8 { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { writer.write_u8(*self)?; @@ -345,25 +362,25 @@ pub fn mt_serialize_seq( C::write_len(iter.len(), writer)?; iter.into_iter() - .try_for_each(|item| item.mt_serialize::(writer)) + .try_for_each(|item| item.mt_serialize::(writer)) } pub fn mt_deserialize_seq<'a, C: MtCfg, T: MtDeserialize>( reader: &'a mut impl Read, ) -> Result> + 'a, DeserializeError> { let len = C::read_len(reader)?; - mt_deserialize_sized_seq(&len, reader) + mt_deserialize_sized_seq::(&len, reader) } -pub fn mt_deserialize_sized_seq<'a, L: MtLen, T: MtDeserialize>( - len: &L, +pub fn mt_deserialize_sized_seq<'a, C: MtCfg, T: MtDeserialize>( + len: &C::Len, reader: &'a mut impl Read, ) -> Result> + 'a, DeserializeError> { let variable = len.option().is_none(); Ok(len .range() - .map_while(move |_| match T::mt_deserialize::(reader) { + .map_while(move |_| match T::mt_deserialize::(reader) { Err(DeserializeError::UnexpectedEof) if variable => None, x => Some(x), })) @@ -437,8 +454,8 @@ impl MtDeserialize for HashSe // TODO: support more tuples impl MtSerialize for (A, B) { fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { - self.0.mt_serialize::(writer)?; - self.1.mt_serialize::(writer)?; + self.0.mt_serialize::(writer)?; + self.1.mt_serialize::(writer)?; Ok(()) } @@ -446,8 +463,8 @@ impl MtSerialize for (A, B) { impl MtDeserialize for (A, B) { fn mt_deserialize(reader: &mut impl Read) -> Result { - let a = A::mt_deserialize::(reader)?; - let b = B::mt_deserialize::(reader)?; + let a = A::mt_deserialize::(reader)?; + let b = B::mt_deserialize::(reader)?; Ok((a, b)) }