use serde::{de, Deserialize, Serialize};
use crate::{gc::*, obj::Obj, Align, Int, List, Set, Size};
impl Serialize for Align {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.bytes().serialize(serializer)
}
}
impl<'de> Deserialize<'de> for Align {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Align::from_bytes(Int::deserialize(deserializer)?)
.ok_or_else(|| de::Error::custom("invalid Align"))
}
}
impl Serialize for Size {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.bytes().serialize(serializer)
}
}
impl<'de> Deserialize<'de> for Size {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Size::from_bytes(Int::deserialize(deserializer)?)
.ok_or_else(|| de::Error::custom("invalid Size"))
}
}
impl Serialize for crate::String {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.0.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for crate::String {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Ok(crate::String(GcCow::deserialize(deserializer)?))
}
}
impl Serialize for crate::Name {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.0.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for crate::Name {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Ok(Self(Deserialize::deserialize(deserializer)?))
}
}
impl<T: Serialize + Obj> Serialize for List<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.0.serialize(serializer)
}
}
impl<'de, T: Obj + Deserialize<'de>> Deserialize<'de> for List<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Ok(List(GcCow::deserialize(deserializer)?))
}
}
impl<T: Serialize + Obj> Serialize for Set<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.0.serialize(serializer)
}
}
impl<'de, T: Obj + Deserialize<'de>> Deserialize<'de> for Set<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Ok(Set(GcCow::deserialize(deserializer)?))
}
}