5 #[cfg(feature = "random")]
6 pub use generate_random;
8 #[cfg(feature = "random")]
11 #[cfg(feature = "serde")]
14 use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
15 use enumset::{EnumSet, EnumSetType, EnumSetTypeWithRepr};
16 use mt_data_derive::mt_derive;
17 pub use mt_data_derive::{MtDeserialize, MtSerialize};
19 collections::{HashMap, HashSet},
22 io::{self, Read, Write},
28 #[cfg(feature = "serde")]
29 use serde::{Deserialize, Serialize};
31 #[cfg(feature = "random")]
32 use generate_random::GenerateRandom;
36 #[derive(Error, Debug)]
37 #[error("variable length")]
40 #[derive(Error, Debug)]
41 pub enum SerializeError {
42 #[error("io error: {0}")]
43 IoError(#[from] io::Error),
44 #[error("collection too big: {0}")]
45 TooBig(#[from] TryFromIntError),
46 #[error("unimplemented")]
50 impl From<Infallible> for DeserializeError {
51 fn from(_err: Infallible) -> Self {
52 unreachable!("infallible")
56 #[derive(Error, Debug)]
57 pub enum DeserializeError {
58 #[error("io error: {0}")]
59 IoError(#[from] io::Error),
60 #[error("variable length not supported")]
61 NoVarlen(#[from] VarLen),
62 #[error("collection too big: {0}")]
63 TooBig(#[from] TryFromIntError),
64 #[error("unimplemented")]
68 impl From<Infallible> for SerializeError {
69 fn from(_err: Infallible) -> Self {
70 unreachable!("infallible")
78 + TryFrom<usize, Error = Self::TryFromError>
79 + TryInto<usize, Error = Self::TryIntoError>
81 type TryFromError: Into<SerializeError>;
82 type TryIntoError: Into<DeserializeError>;
89 fn write_len(len: usize, writer: &mut impl Write) -> Result<(), SerializeError> {
90 Ok(Self::try_from(len)
91 .map_err(|e| e.into())?
92 .mt_serialize::<DefCfg>(writer)?)
96 pub type DefCfg = u16;
98 pub trait MtSerialize: Sized {
99 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError>;
102 pub trait MtDeserialize: Sized {
103 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError>;
107 type TryFromError = TryFromIntError;
108 type TryIntoError = Infallible;
112 type TryFromError = TryFromIntError;
113 type TryIntoError = Infallible;
117 type TryFromError = TryFromIntError;
118 type TryIntoError = TryFromIntError;
122 type TryFromError = TryFromIntError;
123 type TryIntoError = TryFromIntError;
128 impl MtSerialize for NoLen {
129 fn mt_serialize<C: MtCfg>(&self, _writer: &mut impl Write) -> Result<(), SerializeError> {
134 impl MtDeserialize for NoLen {
135 fn mt_deserialize<C: MtCfg>(_reader: &mut impl Read) -> Result<Self, DeserializeError> {
140 impl TryFrom<usize> for NoLen {
141 type Error = Infallible;
143 fn try_from(_x: usize) -> Result<Self, Self::Error> {
148 impl TryInto<usize> for NoLen {
151 fn try_into(self) -> Result<usize, Self::Error> {
156 impl MtCfg for NoLen {
157 type TryFromError = Infallible;
158 type TryIntoError = VarLen;
161 pub struct Utf16<B: MtCfg>(pub B);
163 impl<B: MtCfg> MtSerialize for Utf16<B> {
164 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
165 self.0.mt_serialize::<DefCfg>(writer)
169 impl<B: MtCfg> MtDeserialize for Utf16<B> {
170 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
171 Ok(Self(B::mt_deserialize::<DefCfg>(reader)?))
175 impl<B: MtCfg> TryFrom<usize> for Utf16<B> {
176 type Error = B::TryFromError;
178 fn try_from(x: usize) -> Result<Self, Self::Error> {
179 Ok(Self(x.try_into()?))
183 impl<B: MtCfg> TryInto<usize> for Utf16<B> {
184 type Error = B::TryIntoError;
186 fn try_into(self) -> Result<usize, Self::Error> {
191 impl<B: MtCfg> MtCfg for Utf16<B> {
192 type TryFromError = B::TryFromError;
193 type TryIntoError = B::TryIntoError;
201 impl MtSerialize for u8 {
202 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
203 writer.write_u8(*self)?;
208 impl MtDeserialize for u8 {
209 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
210 Ok(reader.read_u8()?)
214 impl MtSerialize for i8 {
215 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
216 writer.write_i8(*self)?;
221 impl MtDeserialize for i8 {
222 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
223 Ok(reader.read_i8()?)
227 macro_rules! impl_num {
229 impl MtSerialize for $T {
230 fn mt_serialize<C: MtCfg>(
232 writer: &mut impl Write,
233 ) -> Result<(), SerializeError> {
235 writer.[<write_ $T>]::<BigEndian>(*self)?;
241 impl MtDeserialize for $T {
242 fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> {
244 Ok(reader.[<read_ $T>]::<BigEndian>()?)
262 impl MtSerialize for () {
263 fn mt_serialize<C: MtCfg>(&self, _writer: &mut impl Write) -> Result<(), SerializeError> {
268 impl MtSerialize for bool {
269 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
270 (*self as u8).mt_serialize::<DefCfg>(writer)
274 impl<T: MtSerialize, const N: usize> MtSerialize for [T; N] {
275 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
276 self.as_slice().mt_serialize::<NoLen>(writer)
280 impl<T: MtSerialize> MtSerialize for &[T] {
281 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
282 C::write_len(self.len(), writer)?;
283 for item in self.iter() {
284 item.mt_serialize::<DefCfg>(writer)?;
290 impl<T: MtSerialize, E: EnumSetTypeWithRepr<Repr = T>> MtSerialize for EnumSet<E> {
291 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
292 self.as_repr().mt_serialize::<DefCfg>(writer)
296 impl<T: MtSerialize> MtSerialize for Option<T> {
297 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
299 Some(item) => item.mt_serialize::<C>(writer),
305 impl<T: MtSerialize> MtSerialize for Vec<T> {
306 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
307 self.as_slice().mt_serialize::<C>(writer)
311 impl<T: MtSerialize> MtSerialize for HashSet<T> {
312 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
313 C::write_len(self.len(), writer)?;
314 for item in self.iter() {
315 item.mt_serialize::<DefCfg>(writer)?;
321 impl<K, V> MtSerialize for HashMap<K, V>
323 K: MtSerialize + std::cmp::Eq + std::hash::Hash,
326 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
327 C::write_len(self.len(), writer)?;
328 for (key, value) in self.iter() {
329 key.mt_serialize::<DefCfg>(writer)?;
330 value.mt_serialize::<DefCfg>(writer)?;
336 impl MtSerialize for String {
337 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
341 .mt_serialize::<C>(writer)
343 self.as_bytes().mt_serialize::<C>(writer)
348 impl<T: MtSerialize> MtSerialize for Box<T> {
349 fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> {
350 self.deref().mt_serialize::<C>(writer)