use core::marker::PhantomData;
use serde_core::ser::Serialize;
use serde_core::ser::SerializeMap;
use serde_core::ser::SerializeSeq;
use serde_core::ser::Serializer;
use crate::ConstPathSegment;
use crate::Cursor;
use crate::Path;
use crate::PathEnd;
use crate::PathSegment;
impl<T, P> serde_core::Serialize for Cursor<T, P>
where
P: SerializePath<T>,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde_core::Serializer,
{
<P as SerializePath<T>>::serialize(&self.0, serializer)
}
}
pub trait SerializePath<T> {
fn serialize<S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer;
}
impl<T: Serialize> SerializePath<T> for PathEnd {
fn serialize<S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
<T as Serialize>::serialize(value, serializer)
}
}
impl<S, P, T> SerializePath<T> for Path<S, P>
where
S: ConstPathSegment,
P: SerializePath<T>,
{
fn serialize<Ser>(value: &T, serializer: Ser) -> Result<Ser::Ok, Ser::Error>
where
Ser: Serializer,
{
match <S as ConstPathSegment>::VALUE {
PathSegment::Field(name) => {
let mut map = serializer.serialize_map(Some(1))?;
map.serialize_entry(
name,
&DelegateSerializeToSerializePath::<P, T>(value, PhantomData),
)?;
map.end()
}
PathSegment::Index(index) => {
let mut seq = serializer.serialize_seq(Some(index + 1))?;
for _ in 0..index {
seq.serialize_element(&())?; }
seq.serialize_element(&DelegateSerializeToSerializePath::<P, T>(
value,
PhantomData,
))?;
seq.end()
}
}
}
}
pub(crate) struct DelegateSerializeToSerializePath<'a, P, T>(
pub(crate) &'a T,
pub(crate) PhantomData<P>,
);
impl<'a, P, T> Serialize for DelegateSerializeToSerializePath<'a, P, T>
where
P: SerializePath<T>,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
<P as SerializePath<T>>::serialize(self.0, serializer)
}
}
#[cfg(feature = "serde_with")]
impl<T, P> serde_with::SerializeAs<T> for Cursor<T, P>
where
T: Serialize,
P: SerializePath<T>,
{
fn serialize_as<S>(source: &T, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde_core::Serializer,
{
<P as SerializePath<T>>::serialize(source, serializer)
}
}