use core::fmt;
use core::marker::PhantomData;
use serde_core::Deserialize;
use serde_core::Deserializer;
use serde_core::Serializer;
use serde_core::de::SeqAccess;
use serde_core::de::Visitor;
use serde_core::ser::SerializeSeq as _;
use crate::DeserializePath;
use crate::Path;
use crate::Sequence;
use crate::SerializePath;
use crate::de::PathSeed;
use crate::ser::DelegateSerializeToSerializePath;
pub struct RangeFull;
impl<'de, P, C> DeserializePath<'de, C> for Path<RangeFull, P>
where
C: Sequence,
P: DeserializePath<'de, C::Item>,
C::Item: Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<C, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(RangeFullVisitor::<P, C> {
_marker: PhantomData,
})
}
}
struct RangeFullVisitor<P, C> {
_marker: PhantomData<(P, C)>,
}
impl<'de, P, C> Visitor<'de> for RangeFullVisitor<P, C>
where
C: Sequence,
P: DeserializePath<'de, C::Item>,
C::Item: Deserialize<'de>,
{
type Value = C;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("a sequence")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut items = if let Some(capacity) = seq.size_hint() {
<C as Sequence>::with_capacity(capacity)
} else {
<C as Default>::default()
};
let mut index = 0;
while let Some(item) = seq
.next_element_seed(PathSeed::<P, C::Item>(PhantomData))
.map_err(|err| serde_core::de::Error::custom(format_args!("[{index}]{err}")))?
{
items.push(item);
index += 1;
}
Ok(items)
}
}
impl<P, T, C> SerializePath<C> for Path<RangeFull, P>
where
for<'a> &'a C: IntoIterator<Item = &'a T>,
P: SerializePath<T>,
{
fn serialize<S>(value: &C, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(None)?;
for item in value {
seq.serialize_element(&DelegateSerializeToSerializePath::<P, T>(item, PhantomData))?;
}
seq.end()
}
}