conjure_core/ast/
serde.rs1use std::cell::RefCell;
7use std::rc::Rc;
8
9use serde::de::Deserialize;
10use serde::de::Error;
11use serde::Serialize;
12use serde_with::{DeserializeAs, SerializeAs};
13
14pub type ObjId = u32;
19
20pub trait HasId {
27 fn id(&self) -> ObjId;
32}
33
34pub trait DefaultWithId: HasId {
36 fn default_with_id(id: ObjId) -> Self;
38}
39
40pub struct RcRefCellAsId;
50
51impl<T> SerializeAs<Rc<RefCell<T>>> for RcRefCellAsId
54where
55 T: HasId,
56{
57 fn serialize_as<S>(source: &Rc<RefCell<T>>, serializer: S) -> Result<S::Ok, S::Error>
58 where
59 S: serde::Serializer,
60 {
61 let id = (**source).borrow().id();
62 serializer.collect_str(&id)
63 }
64}
65
66impl<'de, T> DeserializeAs<'de, Rc<RefCell<T>>> for RcRefCellAsId
68where
69 T: HasId + DefaultWithId,
70{
71 fn deserialize_as<D>(deserializer: D) -> Result<Rc<RefCell<T>>, D::Error>
72 where
73 D: serde::Deserializer<'de>,
74 {
75 let id = u32::deserialize(deserializer).map_err(Error::custom)?;
76 Ok(Rc::new(RefCell::new(T::default_with_id(id))))
77 }
78}
79
80pub struct RcRefCellAsInner;
88
89impl<T> SerializeAs<Rc<RefCell<T>>> for RcRefCellAsInner
90where
91 T: Serialize + HasId,
92{
93 fn serialize_as<S>(source: &Rc<RefCell<T>>, serializer: S) -> Result<S::Ok, S::Error>
94 where
95 S: serde::Serializer,
96 {
97 (**source).borrow().serialize(serializer)
98 }
99}
100
101impl<T> SerializeAs<Rc<T>> for RcRefCellAsInner
102where
103 T: Serialize + HasId,
104{
105 fn serialize_as<S>(source: &Rc<T>, serializer: S) -> Result<S::Ok, S::Error>
106 where
107 S: serde::Serializer,
108 {
109 source.serialize(serializer)
110 }
111}
112
113impl<'de, T> DeserializeAs<'de, Rc<RefCell<T>>> for RcRefCellAsInner
114where
115 T: Deserialize<'de> + HasId + DefaultWithId,
116{
117 fn deserialize_as<D>(deserializer: D) -> Result<Rc<RefCell<T>>, D::Error>
118 where
119 D: serde::Deserializer<'de>,
120 {
121 let val = T::deserialize(deserializer)?;
122 Ok(Rc::new(RefCell::new(val)))
123 }
124}
125
126impl<'de, T> DeserializeAs<'de, Rc<T>> for RcRefCellAsInner
127where
128 T: Deserialize<'de> + HasId + DefaultWithId,
129{
130 fn deserialize_as<D>(deserializer: D) -> Result<Rc<T>, D::Error>
131 where
132 D: serde::Deserializer<'de>,
133 {
134 let val = T::deserialize(deserializer)?;
135 Ok(Rc::new(val))
136 }
137}