use core::fmt;
use core::marker::PhantomData;
use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor};
use serde::ser::{Serialize, SerializeSeq, Serializer};
use crate::{ChunkedVec, ChunkedVecSized};
impl<T, const N: usize> Serialize for ChunkedVec<T, N>
where
T: Serialize,
{
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut seq = serializer.serialize_seq(Some(self.len()))?;
for elem in self.iter() {
seq.serialize_element(elem)?;
}
seq.end()
}
}
impl<'de, T, const N: usize> Deserialize<'de> for ChunkedVec<T, N>
where
T: Deserialize<'de>,
{
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
struct ChunkedVecVisitor<T, const N: usize>(PhantomData<T>);
impl<'de, T, const N: usize> Visitor<'de> for ChunkedVecVisitor<T, N>
where
T: Deserialize<'de>,
{
type Value = ChunkedVec<T, N>;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("a sequence")
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
const PREALLOC_CAP: usize = 4096;
let cap = seq.size_hint().unwrap_or(0).min(PREALLOC_CAP);
let mut vec = ChunkedVecSized::<T, N>::with_capacity(cap);
while let Some(elem) = seq.next_element()? {
vec.push(elem);
}
Ok(vec)
}
}
deserializer.deserialize_seq(ChunkedVecVisitor(PhantomData))
}
}