rune_core/item/
serde.rs

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}