use crate::{ConcurrentElement, ConcurrentVec};
use core::marker::PhantomData;
use orx_concurrent_option::ConcurrentOption;
use orx_fixed_vec::IntoConcurrentPinnedVec;
use serde::{Deserialize, Serialize, de::Visitor, ser::SerializeSeq};
impl<T, P> Serialize for ConcurrentVec<T, P>
where
P: IntoConcurrentPinnedVec<ConcurrentElement<T>>,
T: Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut seq = serializer.serialize_seq(Some(self.len()))?;
for element in self.iter() {
element.map(|x| seq.serialize_element(x))?;
}
seq.end()
}
}
struct ConcurrentVecDeserializer<T, P>
where
P: IntoConcurrentPinnedVec<ConcurrentElement<T>>,
{
phantom: PhantomData<(T, P)>,
}
impl<'de, T, P> Visitor<'de> for ConcurrentVecDeserializer<T, P>
where
P: IntoConcurrentPinnedVec<ConcurrentElement<T>> + Default,
T: Deserialize<'de>,
{
type Value = ConcurrentVec<T, P>;
fn expecting(&self, formatter: &mut alloc::fmt::Formatter) -> alloc::fmt::Result {
formatter.write_str("Expecting the sequence of elements.")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: serde::de::SeqAccess<'de>,
{
let mut pinned = P::default();
while let Some(x) = seq.next_element::<T>()? {
pinned.push(ConcurrentElement(ConcurrentOption::some(x)));
}
Ok(ConcurrentVec::new_from_pinned(pinned))
}
}
impl<'de, T, P> Deserialize<'de> for ConcurrentVec<T, P>
where
P: IntoConcurrentPinnedVec<ConcurrentElement<T>> + Default,
T: Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
deserializer.deserialize_seq(ConcurrentVecDeserializer {
phantom: PhantomData,
})
}
}