use crate::*;
pub(crate) trait SerializeEmbeddedGroup {
fn serialize_as_embedded_group<'a, W: Write + Sized>(
&self,
serializer: &'a mut Serializer<W>,
) -> cbor_event::Result<&'a mut Serializer<W>>;
}
pub trait Deserialize {
fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError>
where
Self: Sized;
}
impl<T: cbor_event::de::Deserialize> Deserialize for T {
fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<T, DeserializeError> {
T::deserialize(raw).map_err(|e| DeserializeError::from(e))
}
}
pub trait DeserializeEmbeddedGroup {
fn deserialize_as_embedded_group<R: BufRead + Seek>(
raw: &mut Deserializer<R>,
len: cbor_event::Len,
) -> Result<Self, DeserializeError>
where
Self: Sized;
}
pub trait DeserializeNullable {
fn deserialize_nullable<R: BufRead + Seek>(
raw: &mut Deserializer<R>,
) -> Result<Option<Self>, DeserializeError>
where
Self: Sized;
}
impl<T: Deserialize> DeserializeNullable for T {
fn deserialize_nullable<R: BufRead + Seek>(
raw: &mut Deserializer<R>,
) -> Result<Option<Self>, DeserializeError>
where
Self: Sized,
{
if raw.cbor_type()? == CBORType::Special {
if raw.special()? != CBORSpecial::Null {
return Err(DeserializeFailure::ExpectedNull.into());
}
Ok(None)
} else {
Ok(Some(T::deserialize(raw)?))
}
}
}
pub trait SerializeNullable {
fn serialize_nullable<'a, W: Write + Sized>(
&self,
serializer: &'a mut Serializer<W>,
) -> cbor_event::Result<&'a mut Serializer<W>>;
}
impl<T: Serialize> SerializeNullable for Option<T> {
fn serialize_nullable<'a, W: Write + Sized>(
&self,
serializer: &'a mut Serializer<W>,
) -> cbor_event::Result<&'a mut Serializer<W>> {
match self {
Some(x) => x.serialize(serializer),
None => serializer.write_special(CBORSpecial::Null),
}
}
}