osom_lib_arrays/serde_impl/
inline_fixed_array.rs1use 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}