Skip to main content

osom_lib_arrays/serde_impl/
inline_fixed_array.rs

1use core::marker::PhantomData;
2
3use serde::{
4    Deserialize, Serialize,
5    de::{self, Visitor},
6};
7
8use crate::fixed_array::InlineFixedArray;
9use crate::traits::MutableArray;
10
11impl<const CAPACITY: usize, T: Serialize> Serialize for InlineFixedArray<CAPACITY, T> {
12    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
13    where
14        S: serde::Serializer,
15    {
16        self.as_ref().serialize(serializer)
17    }
18}
19
20struct InlineFixedArrayVisitor<const CAPACITY: usize, T> {
21    _phantom: PhantomData<T>,
22}
23
24impl<const CAPACITY: usize, T> InlineFixedArrayVisitor<CAPACITY, T> {
25    #[inline(always)]
26    pub const fn new() -> Self {
27        Self { _phantom: PhantomData }
28    }
29}
30
31impl<'de, const CAPACITY: usize, T: Deserialize<'de>> Visitor<'de> for InlineFixedArrayVisitor<CAPACITY, T> {
32    type Value = InlineFixedArray<CAPACITY, T>;
33
34    fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
35        formatter.write_str("a sequence of deserializable values")
36    }
37
38    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
39    where
40        A: serde::de::SeqAccess<'de>,
41    {
42        let mut result = Self::Value::new();
43        while let Some(item) = seq.next_element()? {
44            result.try_push(item).map_err(de::Error::custom)?;
45        }
46
47        Ok(result)
48    }
49}
50
51impl<'de, const CAPACITY: usize, T: Deserialize<'de>> Deserialize<'de> for InlineFixedArray<CAPACITY, T> {
52    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
53    where
54        D: serde::Deserializer<'de>,
55    {
56        deserializer.deserialize_seq(InlineFixedArrayVisitor::new())
57    }
58}