1use core::fmt;
2use core::marker::PhantomData;
3
4use serde::de::{self, Error as _};
5use serde::ser::{self, SerializeSeq};
6
7use crate::alloc::alloc::Allocator;
8use crate::item::{Component, Item, ItemBuf};
9
10impl ser::Serialize for Item {
11 #[inline]
12 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
13 where
14 S: serde::Serializer,
15 {
16 let mut seq = serializer.serialize_seq(None)?;
17
18 for item in self.iter() {
19 seq.serialize_element(&item)?;
20 }
21
22 seq.end()
23 }
24}
25
26impl<A> ser::Serialize for ItemBuf<A>
27where
28 A: Allocator,
29{
30 #[inline]
31 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
32 where
33 S: serde::Serializer,
34 {
35 self.as_ref().serialize(serializer)
36 }
37}
38
39impl<'de, A> de::Deserialize<'de> for ItemBuf<A>
40where
41 A: Allocator + Default,
42{
43 #[inline]
44 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
45 where
46 D: serde::Deserializer<'de>,
47 {
48 deserializer.deserialize_bytes(BytesVisitor(PhantomData))
49 }
50}
51
52struct BytesVisitor<A>(PhantomData<A>);
53
54impl<'de, A> de::Visitor<'de> for BytesVisitor<A>
55where
56 A: Allocator + Default,
57{
58 type Value = ItemBuf<A>;
59
60 #[inline]
61 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
62 write!(f, "item buffer deserialization to be implemented")
63 }
64
65 #[inline]
66 fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
67 where
68 S: de::SeqAccess<'de>,
69 {
70 let mut buf = ItemBuf::new_in(A::default());
71
72 while let Some(c) = seq.next_element::<Component>()? {
73 buf.push(c).map_err(S::Error::custom)?;
74 }
75
76 Ok(buf)
77 }
78}