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