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}