From 3561472c60acfeda2dadb477a1da4afd287ab30a Mon Sep 17 00:00:00 2001 From: Lizzy Fleckenstein Date: Wed, 15 Feb 2023 01:00:37 +0100 Subject: Support Ranges --- src/lib.rs | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 961e416..b2aebc8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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 MtDeserialize for Box { Ok(Self::new(T::mt_deserialize::(reader)?)) } } + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "Range")] +#[allow(unused)] +struct RemoteRange { + start: T, + end: T, +} + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "RangeFrom")] +#[allow(unused)] +struct RemoteRangeFrom { + start: T, +} + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "RangeFull")] +#[allow(unused)] +struct RemoteRangeFull; + +// RangeInclusive fields are private +impl MtSerialize for RangeInclusive { + fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { + self.start().mt_serialize::(writer)?; + self.end().mt_serialize::(writer)?; + + Ok(()) + } +} + +impl MtDeserialize for RangeInclusive { + fn mt_deserialize(reader: &mut impl Read) -> Result { + let start = T::mt_deserialize::(reader)?; + let end = T::mt_deserialize::(reader)?; + + Ok(start..=end) + } +} + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "RangeTo")] +#[allow(unused)] +struct RemoteRangeTo { + end: T, +} + +#[derive(MtSerialize, MtDeserialize)] +#[mt(typename = "RangeToInclusive")] +#[allow(unused)] +struct RemoteRangeToInclusive { + end: T, +} -- cgit v1.2.3