1use super::Result;
8use crate::{BignumRef, Fixnum, Sym};
9
10pub trait Serialize {
12 fn serialize<S>(&self, serializer: S) -> Result<S::Ok>
14 where
15 S: Serializer;
16}
17
18pub trait Serializer: Sized {
22 type Ok;
24
25 type SerializeIvars: SerializeIvars<Ok = Self::Ok>;
27 type SerializeHash: SerializeHash<Ok = Self::Ok>;
29 type SerializeArray: SerializeArray<Ok = Self::Ok>;
31
32 fn serialize_nil(self) -> Result<Self::Ok>;
34
35 fn serialize_bool(self, v: bool) -> Result<Self::Ok>;
37
38 fn serialize_fixnum(self, v: Fixnum) -> Result<Self::Ok>;
40
41 fn serialize_bignum(self, v: BignumRef<'_>) -> Result<Self::Ok>;
43
44 fn serialize_f64(self, v: f64) -> Result<Self::Ok>;
46
47 fn serialize_hash(self, len: usize) -> Result<Self::SerializeHash>;
49
50 fn serialize_array(self, len: usize) -> Result<Self::SerializeArray>;
52
53 fn serialize_string(self, data: &[u8]) -> Result<Self::Ok>;
55
56 fn serialize_symbol(self, sym: &Sym) -> Result<Self::Ok>;
58
59 fn serialize_regular_expression(self, regex: &[u8], flags: u8) -> Result<Self::Ok>;
61
62 fn serialize_object(self, class: &Sym, len: usize) -> Result<Self::SerializeIvars>;
64
65 fn serialize_struct(self, name: &Sym, len: usize) -> Result<Self::SerializeIvars>;
67
68 fn serialize_class(self, class: &Sym) -> Result<Self::Ok>;
70
71 fn serialize_module(self, module: &Sym) -> Result<Self::Ok>;
73
74 fn serialize_instance<V>(self, value: &V, len: usize) -> Result<Self::SerializeIvars>
76 where
77 V: Serialize + ?Sized;
78
79 fn serialize_extended<V>(self, module: &Sym, value: &V) -> Result<Self::Ok>
81 where
82 V: Serialize + ?Sized;
83
84 fn serialize_user_class<V>(self, class: &Sym, value: &V) -> Result<Self::Ok>
86 where
87 V: Serialize + ?Sized;
88
89 fn serialize_user_data(self, class: &Sym, data: &[u8]) -> Result<Self::Ok>;
91
92 fn serialize_user_marshal<V>(self, class: &Sym, value: &V) -> Result<Self::Ok>
94 where
95 V: Serialize + ?Sized;
96
97 fn serialize_data<V>(self, class: &Sym, value: &V) -> Result<Self::Ok>
99 where
100 V: Serialize + ?Sized;
101
102 fn serialize_rust_string(self, string: &str) -> Result<Self::Ok> {
104 struct StringSerialize<'a>(&'a str);
105 impl Serialize for StringSerialize<'_> {
106 fn serialize<S>(&self, serializer: S) -> Result<S::Ok>
107 where
108 S: Serializer,
109 {
110 serializer.serialize_string(self.0.as_bytes())
111 }
112 }
113 let mut fields = self.serialize_instance(&StringSerialize(string), 1)?;
114 fields.serialize_entry(Sym::new("E"), &true)?;
115 fields.end()
116 }
117
118 fn collect_array<I>(self, iter: I) -> Result<Self::Ok>
120 where
121 I: IntoIterator,
122 I::IntoIter: ExactSizeIterator,
123 I::Item: Serialize,
124 {
125 let iter = iter.into_iter();
126 let mut serialize_array = self.serialize_array(iter.len())?;
127 for item in iter {
128 serialize_array.serialize_element(&item)?;
129 }
130 serialize_array.end()
131 }
132
133 fn collect_hash<K, V, I>(self, iter: I) -> Result<Self::Ok>
135 where
136 I: IntoIterator<Item = (K, V)>,
137 I::IntoIter: ExactSizeIterator,
138 K: Serialize,
139 V: Serialize,
140 {
141 let iter = iter.into_iter();
142 let mut serialize_hash = self.serialize_hash(iter.len())?;
143 for (key, value) in iter {
144 serialize_hash.serialize_entry(&key, &value)?;
145 }
146 serialize_hash.end()
147 }
148}
149
150pub trait SerializeIvars {
152 type Ok;
154
155 fn serialize_field(&mut self, k: &Sym) -> Result<()>;
167
168 fn serialize_value<V>(&mut self, v: &V) -> Result<()>
172 where
173 V: Serialize + ?Sized;
174
175 fn serialize_entry<V>(&mut self, k: &Sym, v: &V) -> Result<()>
177 where
178 V: Serialize + ?Sized,
179 {
180 self.serialize_field(k)?;
181 self.serialize_value(v)
182 }
183
184 fn end(self) -> Result<Self::Ok>;
186}
187
188pub trait SerializeHash {
190 type Ok;
192
193 fn serialize_key<K>(&mut self, k: &K) -> Result<()>
195 where
196 K: Serialize + ?Sized;
197
198 fn serialize_value<V>(&mut self, v: &V) -> Result<()>
202 where
203 V: Serialize + ?Sized;
204
205 fn serialize_entry<K, V>(&mut self, k: &K, v: &V) -> Result<()>
207 where
208 K: Serialize + ?Sized,
209 V: Serialize + ?Sized,
210 {
211 self.serialize_key(k)?;
212 self.serialize_value(v)
213 }
214
215 fn end(self) -> Result<Self::Ok>;
217}
218
219pub trait SerializeArray {
221 type Ok;
223
224 fn serialize_element<T>(&mut self, v: &T) -> Result<()>
226 where
227 T: Serialize + ?Sized;
228
229 fn end(self) -> Result<Self::Ok>;
231}