diff options
author | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-02-15 01:00:37 +0100 |
---|---|---|
committer | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-02-15 01:00:37 +0100 |
commit | 3561472c60acfeda2dadb477a1da4afd287ab30a (patch) | |
tree | 10163fee2b589b60b6b110e8c6cbceec1a11d0ad /src | |
parent | cb575e5bb1eef9afc2b732e77108fe7e11e68ef5 (diff) | |
download | mt_ser-3561472c60acfeda2dadb477a1da4afd287ab30a.tar.xz |
Support Ranges
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 57 |
1 files changed, 56 insertions, 1 deletions
@@ -16,13 +16,15 @@ use std::{ fmt::Debug, io::{self, Read, Write}, num::TryFromIntError, - ops::Deref, + ops::{Deref, Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive}, }; use thiserror::Error; #[cfg(test)] mod tests; +use crate as mt_ser; + #[derive(Error, Debug)] pub enum SerializeError { #[error("io error: {0}")] @@ -559,3 +561,56 @@ impl<T: MtDeserialize> MtDeserialize for Box<T> { Ok(Self::new(T::mt_deserialize::<C>(reader)?)) } } + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "Range")] +#[allow(unused)] +struct RemoteRange<T> { + start: T, + end: T, +} + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "RangeFrom")] +#[allow(unused)] +struct RemoteRangeFrom<T> { + start: T, +} + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "RangeFull")] +#[allow(unused)] +struct RemoteRangeFull; + +// RangeInclusive fields are private +impl<T: MtSerialize> MtSerialize for RangeInclusive<T> { + fn mt_serialize<C: MtCfg>(&self, writer: &mut impl Write) -> Result<(), SerializeError> { + self.start().mt_serialize::<DefCfg>(writer)?; + self.end().mt_serialize::<DefCfg>(writer)?; + + Ok(()) + } +} + +impl<T: MtDeserialize> MtDeserialize for RangeInclusive<T> { + fn mt_deserialize<C: MtCfg>(reader: &mut impl Read) -> Result<Self, DeserializeError> { + let start = T::mt_deserialize::<DefCfg>(reader)?; + let end = T::mt_deserialize::<DefCfg>(reader)?; + + Ok(start..=end) + } +} + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "RangeTo")] +#[allow(unused)] +struct RemoteRangeTo<T> { + end: T, +} + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "RangeToInclusive")] +#[allow(unused)] +struct RemoteRangeToInclusive<T> { + end: T, +} |