1 #![feature(array_try_from_fn)]
2 #![feature(associated_type_bounds)]
3 #![feature(iterator_try_collect)]
9 #[cfg(feature = "random")]
10 pub use generate_random;
12 #[cfg(feature = "random")]
15 #[cfg(feature = "serde")]
18 use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
19 use enumset::{EnumSet, EnumSetType, EnumSetTypeWithRepr};
20 use mt_data_derive::mt_derive;
21 pub use mt_data_derive::{MtDeserialize, MtSerialize};
22 use paste::paste as paste_macro;
24 collections::{HashMap, HashSet},
27 io::{self, Read, Write},
33 #[cfg(feature = "serde")]
34 use serde::{Deserialize, Serialize};
36 #[cfg(feature = "random")]
37 use generate_random::GenerateRandom;
39 #[cfg(any(feature = "client", feature = "server"))]
42 #[derive(Error, Debug)]
43 pub enum SerializeError {
44 #[error("io error: {0}")]
45 IoError(#[from] io::Error),
46 #[error("collection too big: {0}")]
47 TooBig(#[from] TryFromIntError),
50 impl From<Infallible> for SerializeError {
51 fn from(_err: Infallible) -> Self {
52 unreachable!("infallible")
56 #[derive(Error, Debug)]
57 pub enum DeserializeError {
58 #[error("io error: {0}")]
60 #[error("unexpected end of file")]
62 #[error("collection too big: {0}")]
63 TooBig(#[from] TryFromIntError),
64 #[error("invalid UTF-16: {0}")]
65 InvalidUtf16(#[from] std::char::DecodeUtf16Error),
66 #[error("unimplemented")]
70 impl From<Infallible> for DeserializeError {
71 fn from(_err: Infallible) -> Self {
72 unreachable!("infallible")
76 impl From<io::Error> for DeserializeError {
77 fn from(err: io::Error) -> Self {
78 if err.kind() == io::ErrorKind::UnexpectedEof {
79 DeserializeError::UnexpectedEof
81 DeserializeError::IoError(err)
86 pub trait OrDefault<T> {
87 fn or_default(self) -> Self;
90 impl<T: MtDeserialize + Default> OrDefault<T> for Result<T, DeserializeError> {
91 fn or_default(self) -> Self {
93 Err(DeserializeError::UnexpectedEof) => Ok(T::default()),
100 Sized + MtSerialize + MtDeserialize + TryFrom<usize, Error: Into<SerializeError>>
102 type Range: Iterator<Item = usize> + 'static;
108 fn var_len() -> bool;
110 fn write_len(len: usize, writer: &mut impl Write) -> Result<(), SerializeError> {
112 .map_err(Into::into)?
113 .mt_serialize::<DefCfg>(writer)
116 fn read_len(reader: &mut impl Read) -> Result<Self::Range, DeserializeError>;
123 + TryFrom<usize, Error: Into<SerializeError>>
124 + TryInto<usize, Error: Into<DeserializeError>>
128 impl<T: MtCfgLen> MtCfg for T {
129 type Range = std::ops::Range<usize>;
131 fn var_len() -> bool {
135 fn read_len(reader: &mut impl Read) -> Result<Self::Range, DeserializeError> {
136 let len = Self::mt_deserialize::<DefCfg>(reader)?
138 .map_err(Into::into)?;
144 pub type DefCfg = u16;
146 pub trait MtSerialize: Sized {
147 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError>;
150 pub trait MtDeserialize: Sized {
151 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError>;
154 impl MtCfgLen for u8 {}
155 impl MtCfgLen for u16 {}
156 impl MtCfgLen for u32 {}
157 impl MtCfgLen for u64 {}
162 impl MtSerialize for NoLen {
163 fn mt_serialize<C: MtCfg>(&self, _writer: &mut impl Write) -> Result<(), SerializeError> {
168 impl MtDeserialize for NoLen {
169 fn mt_deserialize<C: MtCfg>(_reader: &mut impl Read) -> Result<Self, DeserializeError> {
174 impl TryFrom<usize> for NoLen {
175 type Error = Infallible;
177 fn try_from(_x: usize) -> Result<Self, Self::Error> {
182 impl MtCfg for NoLen {
183 fn var_len() -> bool {
187 type Range = std::ops::RangeFrom<usize>;
189 fn read_len(_reader: &mut impl Read) -> Result<Self::Range, DeserializeError> {
194 pub struct Utf16<B: MtCfg>(pub B);
196 impl<B: MtCfg> MtSerialize for Utf16<B> {
197 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
198 self.0.mt_serialize::<DefCfg>(writer)
202 impl<B: MtCfg> MtDeserialize for Utf16<B> {
203 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
204 Ok(Self(B::mt_deserialize::<DefCfg>(reader)?))
208 impl<B: MtCfg> TryFrom<usize> for Utf16<B> {
209 type Error = <usize as TryInto<B>>::Error;
211 fn try_from(x: usize) -> Result<Self, Self::Error> {
212 Ok(Self(x.try_into()?))
216 impl<B: MtCfg> MtCfg for Utf16<B> {
217 type Range = B::Range;
223 fn var_len() -> bool {
227 fn read_len(reader: &mut impl Read) -> Result<Self::Range, DeserializeError> {
232 impl MtSerialize for u8 {
233 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
234 writer.write_u8(*self)?;
239 impl MtDeserialize for u8 {
240 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
241 Ok(reader.read_u8()?)
245 impl MtSerialize for i8 {
246 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
247 writer.write_i8(*self)?;
252 impl MtDeserialize for i8 {
253 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
254 Ok(reader.read_i8()?)
258 macro_rules! impl_num {
260 impl MtSerialize for $T {
261 fn mt_serialize<C: MtCfg>(
263 writer: &mut impl Write,
264 ) -> Result<(), SerializeError> {
266 writer.[<write_ $T>]::<BigEndian>(*self)?;
272 impl MtDeserialize for $T {
273 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
275 Ok(reader.[<read_ $T>]::<BigEndian>()?)
293 impl MtSerialize for () {
294 fn mt_serialize<C: MtCfg>(&self, _writer: &mut impl Write) -> Result<(), SerializeError> {
299 impl MtDeserialize for () {
300 fn mt_deserialize<C: MtCfg>(_reader: &mut impl Read) -> Result<Self, DeserializeError> {
305 impl MtSerialize for bool {
306 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
307 (*self as u8).mt_serialize::<DefCfg>(writer)
311 impl MtDeserialize for bool {
312 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
313 Ok(u8::mt_deserialize::<DefCfg>(reader)? != 0)
317 impl<T: MtSerialize> MtSerialize for &T {
318 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
319 (*self).mt_serialize::<C>(writer)
323 fn mt_serialize_seq<C: MtCfg, T: MtSerialize>(
324 writer: &mut impl Write,
325 iter: impl ExactSizeIterator + IntoIterator<Item = T>,
326 ) -> Result<(), SerializeError> {
327 C::write_len(iter.len(), writer)?;
330 .try_for_each(|item| item.mt_serialize::<DefCfg>(writer))
333 fn mt_deserialize_seq<'a, C: MtCfg, T: MtDeserialize>(
334 reader: &'a mut impl Read,
335 ) -> Result<impl Iterator<Item = Result<T, DeserializeError>> + 'a, DeserializeError> {
336 Ok(C::read_len(reader)?
338 .map_while(|_| match T::mt_deserialize::<DefCfg>(reader) {
339 Err(DeserializeError::UnexpectedEof) if C::var_len() => None,
344 impl<T: MtSerialize, const N: usize> MtSerialize for [T; N] {
345 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
346 mt_serialize_seq::<NoLen, _>(writer, self.iter())
350 impl<T: MtDeserialize, const N: usize> MtDeserialize for [T; N] {
351 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
352 std::array::try_from_fn(|_| T::mt_deserialize::<DefCfg>(reader))
356 impl<T: MtSerialize, E: EnumSetTypeWithRepr<Repr = T>> MtSerialize for EnumSet<E> {
357 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
358 self.as_repr().mt_serialize::<DefCfg>(writer)
362 impl<T: MtDeserialize, E: EnumSetTypeWithRepr<Repr = T>> MtDeserialize for EnumSet<E> {
363 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
364 Ok(Self::from_repr_truncated(T::mt_deserialize::<DefCfg>(
370 impl<T: MtSerialize> MtSerialize for Option<T> {
371 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
373 Some(item) => item.mt_serialize::<C>(writer),
379 impl<T: MtDeserialize> MtDeserialize for Option<T> {
380 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
381 T::mt_deserialize::<C>(reader).map(Some).or_default()
385 impl<T: MtSerialize> MtSerialize for Vec<T> {
386 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
387 mt_serialize_seq::<C, _>(writer, self.iter())
391 impl<T: MtDeserialize> MtDeserialize for Vec<T> {
392 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
393 mt_deserialize_seq::<C, _>(reader)?.try_collect()
397 impl<T: MtSerialize + std::cmp::Eq + std::hash::Hash> MtSerialize for HashSet<T> {
398 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
399 mt_serialize_seq::<C, _>(writer, self.iter())
403 impl<T: MtDeserialize + std::cmp::Eq + std::hash::Hash> MtDeserialize for HashSet<T> {
404 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
405 mt_deserialize_seq::<C, _>(reader)?.try_collect()
409 impl<A: MtSerialize, B: MtSerialize> MtSerialize for (A, B) {
410 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
411 self.0.mt_serialize::<DefCfg>(writer)?;
412 self.1.mt_serialize::<DefCfg>(writer)?;
418 impl<A: MtDeserialize, B: MtDeserialize> MtDeserialize for (A, B) {
419 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
420 let a = A::mt_deserialize::<DefCfg>(reader)?;
421 let b = B::mt_deserialize::<DefCfg>(reader)?;
427 impl<K, V> MtSerialize for HashMap<K, V>
429 K: MtSerialize + std::cmp::Eq + std::hash::Hash,
432 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
433 mt_serialize_seq::<C, _>(writer, self.iter())
437 impl<K, V> MtDeserialize for HashMap<K, V>
439 K: MtDeserialize + std::cmp::Eq + std::hash::Hash,
442 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
443 mt_deserialize_seq::<C, _>(reader)?.try_collect()
447 impl MtSerialize for String {
448 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
451 .collect::<Vec<_>>() // FIXME: is this allocation necessary?
452 .mt_serialize::<C>(writer)
454 mt_serialize_seq::<C, _>(writer, self.as_bytes().iter())
459 impl MtDeserialize for String {
460 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
465 char::decode_utf16(mt_deserialize_seq::<C, _>(reader)?.map_while(|x| match x {
479 // TODO: UTF-8 decode
485 impl<T: MtSerialize> MtSerialize for Box<T> {
486 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
487 self.deref().mt_serialize::<C>(writer)
491 impl<T: MtDeserialize> MtDeserialize for Box<T> {
492 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
493 Ok(Self::new(T::mt_deserialize::<C>(reader)?))