shiny_configuration/value/
serializer.rs1use std::collections::HashMap;
2use std::fmt::Display;
3use crate::value::Value;
4use serde::ser::{SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple, SerializeTupleStruct, SerializeTupleVariant};
5use serde::{Serialize, Serializer};
6use thiserror::Error;
7
8
9#[derive(Debug, Error)]
10pub enum SerializerError {
11 #[error("{0}")]
12 Message(String),
13
14 #[error("key must be a string")]
15 KeyMustBeAString,
16}
17
18impl serde::ser::Error for SerializerError {
19 fn custom<T>(msg: T) -> Self
20 where T: Display,
21 {
22 SerializerError::Message(msg.to_string())
23 }
24}
25
26
27pub struct ValueSerializer;
28
29impl Serializer for ValueSerializer {
30 type Ok = Value;
31 type Error = SerializerError;
32 type SerializeSeq = SeqSerializer;
33 type SerializeTuple = TupleSerializer;
34 type SerializeTupleStruct = TupleStructSerializer;
35 type SerializeTupleVariant = TupleVariantSerializer<'static>;
36 type SerializeMap = MapSerializer;
37 type SerializeStruct = StructSerializer;
38 type SerializeStructVariant = StructVariantSerializer<'static>;
39
40 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
41 Ok(Value::Bool(v))
42 }
43
44 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
45 Ok(v.into())
46 }
47
48 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
49 Ok(v.into())
50 }
51
52 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
53 Ok(v.into())
54 }
55
56 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
57 Ok(v.into())
58 }
59
60 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
61 Ok(v.into())
62 }
63
64 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
65 Ok(v.into())
66 }
67
68 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
69 Ok(v.into())
70 }
71
72 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
73 Ok(v.into())
74 }
75
76 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
77 Ok(v.into())
78 }
79
80 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
81 Ok(v.into())
82 }
83
84 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
85 Ok(v.to_string().into())
86 }
87
88 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
89 Ok(v.into())
90 }
91
92 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
93 let mut seq = self.serialize_seq(Some(v.len()))?;
94 for byte in v {
95 seq.serialize_element(byte)?;
96 }
97
98 seq.end()
99 }
100
101 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
102 Ok(Value::None)
103 }
104
105 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
106 where
107 T: Serialize,
108 {
109 value.serialize(self)
110 }
111
112 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
113 Ok(Value::None)
114 }
115
116 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
117 self.serialize_unit()
118 }
119
120 fn serialize_unit_variant(
121 self,
122 _name: &'static str,
123 _variant_index: u32,
124 variant: &'static str,
125 ) -> Result<Self::Ok, Self::Error> {
126 self.serialize_str(variant)
127 }
128
129 fn serialize_newtype_struct<T: ?Sized>(
130 self,
131 _name: &'static str,
132 value: &T,
133 ) -> Result<Self::Ok, Self::Error>
134 where
135 T: Serialize,
136 {
137 value.serialize(self)
138 }
139
140 fn serialize_newtype_variant<T: ?Sized>(
141 self,
142 _name: &'static str,
143 _variant_index: u32,
144 variant: &'static str,
145 value: &T,
146 ) -> Result<Self::Ok, Self::Error>
147 where
148 T: Serialize,
149 {
150 Ok(Value::Map(HashMap::from([(variant.to_string(), value.serialize(self)?)])))
151 }
152
153 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
154 Ok(SeqSerializer::new(len))
155 }
156
157 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
158 Ok(TupleSerializer::new(len))
159 }
160
161 fn serialize_tuple_struct(
162 self,
163 _name: &'static str,
164 len: usize,
165 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
166 Ok(TupleStructSerializer::new(len))
167 }
168
169 fn serialize_tuple_variant(
170 self,
171 _name: &'static str,
172 _variant_index: u32,
173 variant: &'static str,
174 len: usize,
175 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
176 Ok(TupleVariantSerializer::new(variant, len))
177 }
178
179 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
180 Ok(MapSerializer::new(len))
181 }
182
183 fn serialize_struct(
184 self,
185 _name: &'static str,
186 len: usize,
187 ) -> Result<Self::SerializeStruct, Self::Error> {
188 Ok(StructSerializer::new(len))
189 }
190
191 fn serialize_struct_variant(
192 self,
193 _name: &'static str,
194 _variant_index: u32,
195 variant: &'static str,
196 len: usize,
197 ) -> Result<Self::SerializeStructVariant, Self::Error> {
198 Ok(StructVariantSerializer::new(variant, len))
199 }
200}
201
202pub struct SeqSerializer {
203 sequence: Vec<Value>,
204}
205
206impl SeqSerializer {
207 pub fn new(len: Option<usize>) -> Self {
208 SeqSerializer {
209 sequence: Vec::with_capacity(len.unwrap_or(0)),
210 }
211 }
212}
213
214impl SerializeSeq for SeqSerializer {
215 type Ok = Value;
216 type Error = SerializerError;
217
218 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
219 where
220 T: Serialize,
221 {
222 self.sequence.push(value.serialize(ValueSerializer)?);
223 Ok(())
224 }
225
226 fn end(self) -> Result<Self::Ok, Self::Error> {
227 Ok(self.sequence.into())
228 }
229}
230
231pub struct MapSerializer {
232 keys: Vec<String>,
233 values: Vec<Value>,
234}
235
236impl MapSerializer {
237 pub fn new(len: Option<usize>) -> Self {
238 MapSerializer {
239 keys: Vec::with_capacity(len.unwrap_or(0)),
240 values: Vec::with_capacity(len.unwrap_or(0)),
241 }
242 }
243}
244
245impl SerializeMap for MapSerializer {
246 type Ok = Value;
247 type Error = SerializerError;
248
249 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
250 where
251 T: Serialize,
252 {
253 match key.serialize(ValueSerializer)? {
254 Value::String(s) => self.keys.push(s),
255 _ => return Err(SerializerError::KeyMustBeAString),
256 };
257
258 Ok(())
259 }
260
261 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
262 where
263 T: Serialize,
264 {
265 self.values.push(value.serialize(ValueSerializer)?);
266 Ok(())
267 }
268
269 fn end(self) -> Result<Self::Ok, Self::Error> {
270 let iter = self.keys.into_iter().zip(self.values);
271 Ok(iter.collect::<HashMap<String, Value>>().into())
272 }
273}
274
275pub struct TupleSerializer {
276 seq_serializer: SeqSerializer,
277}
278
279impl TupleSerializer {
280 pub fn new(len: usize) -> Self {
281 TupleSerializer {
282 seq_serializer: SeqSerializer::new(Some(len)),
283 }
284 }
285}
286
287impl SerializeTuple for TupleSerializer {
288 type Ok = Value;
289 type Error = SerializerError;
290
291 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), SerializerError>
292 where
293 T: Serialize,
294 {
295 self.seq_serializer.serialize_element(value)
296 }
297
298 fn end(self) -> Result<Self::Ok, Self::Error> {
299 self.seq_serializer.end()
300 }
301}
302
303pub struct TupleStructSerializer {
304 seq_serializer: SeqSerializer,
305}
306
307impl TupleStructSerializer {
308 pub fn new(len: usize) -> Self {
309 TupleStructSerializer {
310 seq_serializer: SeqSerializer::new(Some(len)),
311 }
312 }
313}
314
315impl SerializeTupleStruct for TupleStructSerializer {
316 type Ok = Value;
317 type Error = SerializerError;
318
319 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), SerializerError>
320 where
321 T: Serialize,
322 {
323 self.seq_serializer.serialize_element(value)
324 }
325
326 fn end(self) -> Result<Self::Ok, Self::Error> {
327 self.seq_serializer.end()
328 }
329}
330
331pub struct StructSerializer {
332 map_serializer: MapSerializer,
333}
334
335impl StructSerializer {
336 pub fn new(len: usize) -> Self {
337 StructSerializer {
338 map_serializer: MapSerializer::new(Some(len)),
339 }
340 }
341}
342
343impl SerializeStruct for StructSerializer {
344 type Ok = Value;
345 type Error = SerializerError;
346
347 fn serialize_field<T: ?Sized>(
348 &mut self,
349 key: &'static str,
350 value: &T,
351 ) -> Result<(), Self::Error>
352 where
353 T: Serialize,
354 {
355 self.map_serializer.serialize_entry(key, value)
356 }
357
358 fn end(self) -> Result<Self::Ok, Self::Error> {
359 self.map_serializer.end()
360 }
361}
362
363pub struct StructVariantSerializer<'de> {
364 name: &'de str,
365 map_serializer: StructSerializer,
366}
367
368impl<'de> StructVariantSerializer<'de> {
369 pub fn new(name: &'de str, len: usize) -> Self {
370 StructVariantSerializer {
371 name,
372 map_serializer: StructSerializer::new(len),
373 }
374 }
375}
376
377impl<'a> SerializeStructVariant for StructVariantSerializer<'a> {
378 type Ok = Value;
379 type Error = SerializerError;
380
381 fn serialize_field<T: ?Sized>(
382 &mut self,
383 key: &'static str,
384 value: &T,
385 ) -> Result<(), Self::Error>
386 where
387 T: Serialize,
388 {
389 self.map_serializer.serialize_field(key, value)
390 }
391
392 fn end(self) -> Result<Self::Ok, Self::Error> {
393 let map = self.map_serializer.end()?;
394
395 let map = Value::Map(HashMap::from([(self.name.to_string(), map)]));
396
397 Ok(map)
398 }
399}
400
401pub struct TupleVariantSerializer<'de> {
402 name: &'de str,
403 seq_serializer: SeqSerializer,
404}
405
406impl<'de> TupleVariantSerializer<'de> {
407 pub fn new(name: &'de str, len: usize) -> Self {
408 TupleVariantSerializer {
409 name,
410 seq_serializer: SeqSerializer::new(Some(len)),
411 }
412 }
413}
414
415impl<'a> SerializeTupleVariant for TupleVariantSerializer<'a> {
416 type Ok = Value;
417 type Error = SerializerError;
418
419 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
420 where
421 T: Serialize,
422 {
423 self.seq_serializer.serialize_element(value)
424 }
425
426 fn end(self) -> Result<Self::Ok, Self::Error> {
427 let map = self.seq_serializer.end()?;
428
429 let map = Value::Map(HashMap::from([(self.name.to_string(), map)]));
430
431 Ok(map)
432 }
433}