musli/serde/
ser.rs

1use core::any::TypeId;
2use core::fmt;
3
4use crate::en::{EntriesEncoder, EntryEncoder, MapEncoder, SequenceEncoder, VariantEncoder};
5use crate::mode::Text;
6use crate::{Context, Encoder};
7
8use super::error::{SerdeError, err};
9
10use serde::ser::{self, Serialize};
11
12pub(super) struct Serializer<E> {
13    encoder: E,
14}
15
16impl<E> Serializer<E> {
17    #[inline]
18    pub(super) fn new(encoder: E) -> Self {
19        Self { encoder }
20    }
21}
22
23impl<E> ser::Serializer for Serializer<E>
24where
25    E: Encoder,
26{
27    type Ok = ();
28    type Error = SerdeError<E::Error>;
29
30    type SerializeSeq = SerializeSeq<E::EncodeSequence>;
31    type SerializeTuple = SerializeSeq<E::EncodeSequence>;
32    type SerializeTupleStruct = SerializeSeq<E::EncodeSequence>;
33    type SerializeTupleVariant = SerializeSeq<E::EncodeSequenceVariant>;
34    type SerializeMap = SerializeMap<E::EncodeMapEntries>;
35    type SerializeStruct = SerializeStruct<E::EncodeMap>;
36    type SerializeStructVariant = SerializeStructVariant<E::EncodeMapVariant>;
37
38    #[inline]
39    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
40        Ok(self.encoder.encode_bool(v)?)
41    }
42
43    #[inline]
44    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
45        Ok(self.encoder.encode_i8(v)?)
46    }
47
48    #[inline]
49    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
50        Ok(self.encoder.encode_i16(v)?)
51    }
52
53    #[inline]
54    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
55        Ok(self.encoder.encode_i32(v)?)
56    }
57
58    #[inline]
59    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
60        Ok(self.encoder.encode_i64(v)?)
61    }
62
63    #[inline]
64    fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
65        Ok(self.encoder.encode_i128(v)?)
66    }
67
68    #[inline]
69    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
70        Ok(self.encoder.encode_u8(v)?)
71    }
72
73    #[inline]
74    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
75        Ok(self.encoder.encode_u16(v)?)
76    }
77
78    #[inline]
79    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
80        Ok(self.encoder.encode_u32(v)?)
81    }
82
83    #[inline]
84    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
85        Ok(self.encoder.encode_u64(v)?)
86    }
87
88    #[inline]
89    fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
90        Ok(self.encoder.encode_u128(v)?)
91    }
92
93    #[inline]
94    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
95        Ok(self.encoder.encode_f32(v)?)
96    }
97
98    #[inline]
99    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
100        Ok(self.encoder.encode_f64(v)?)
101    }
102
103    #[inline]
104    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
105        Ok(self.encoder.encode_char(v)?)
106    }
107
108    #[inline]
109    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
110        Ok(self.encoder.encode_string(v)?)
111    }
112
113    #[inline]
114    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
115        Ok(self.encoder.encode_bytes(v)?)
116    }
117
118    #[inline]
119    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
120        Ok(self.encoder.encode_none()?)
121    }
122
123    #[inline]
124    fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
125    where
126        T: ?Sized + ser::Serialize,
127    {
128        let encoder = self.encoder.encode_some()?;
129        value.serialize(Serializer::new(encoder))
130    }
131
132    #[inline]
133    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
134        Ok(self.encoder.encode_empty()?)
135    }
136
137    #[inline]
138    fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
139        Ok(self.encoder.encode_empty()?)
140    }
141
142    #[inline]
143    fn serialize_unit_variant(
144        self,
145        _: &'static str,
146        _: u32,
147        variant_name: &'static str,
148    ) -> Result<Self::Ok, Self::Error> {
149        encode_variant(self.encoder, variant_name, |encoder| encoder.encode_empty())
150    }
151
152    #[inline]
153    fn serialize_newtype_struct<T>(
154        self,
155        _: &'static str,
156        value: &T,
157    ) -> Result<Self::Ok, Self::Error>
158    where
159        T: ?Sized + ser::Serialize,
160    {
161        value.serialize(Serializer::new(self.encoder))
162    }
163
164    #[inline]
165    fn serialize_newtype_variant<T>(
166        self,
167        _: &'static str,
168        _: u32,
169        variant_name: &'static str,
170        value: &T,
171    ) -> Result<Self::Ok, Self::Error>
172    where
173        T: ?Sized + ser::Serialize,
174    {
175        encode_variant(self.encoder, variant_name, move |encoder| {
176            let err = err(encoder.cx());
177            value.serialize(Serializer::new(encoder)).map_err(err)
178        })
179    }
180
181    #[inline]
182    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
183        let encoder = self.encoder.encode_sequence(len)?;
184        Ok(SerializeSeq::new(encoder))
185    }
186
187    #[inline]
188    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
189        let encoder = self.encoder.encode_sequence(len)?;
190        Ok(SerializeSeq::new(encoder))
191    }
192
193    #[inline]
194    fn serialize_tuple_struct(
195        self,
196        _: &'static str,
197        len: usize,
198    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
199        let encoder = self.encoder.encode_sequence(len)?;
200        Ok(SerializeSeq::new(encoder))
201    }
202
203    #[inline]
204    fn serialize_tuple_variant(
205        self,
206        _: &'static str,
207        _: u32,
208        variant_name: &'static str,
209        len: usize,
210    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
211        let encoder = self.encoder.encode_sequence_variant(variant_name, len)?;
212        Ok(SerializeSeq::new(encoder))
213    }
214
215    #[inline]
216    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
217        let cx = self.encoder.cx();
218
219        let Some(len) = len else {
220            return Err(SerdeError::from(
221                cx.message("Can only serialize maps with known lengths"),
222            ));
223        };
224
225        let encoder = self.encoder.encode_map_entries(len)?;
226        Ok(SerializeMap::new(encoder))
227    }
228
229    #[inline]
230    fn serialize_struct(
231        self,
232        _: &'static str,
233        len: usize,
234    ) -> Result<Self::SerializeStruct, Self::Error> {
235        let encoder = self.encoder.encode_map(len)?;
236        Ok(SerializeStruct::new(encoder))
237    }
238
239    #[inline]
240    fn serialize_struct_variant(
241        self,
242        _: &'static str,
243        _: u32,
244        variant_name: &'static str,
245        len: usize,
246    ) -> Result<Self::SerializeStructVariant, Self::Error> {
247        let encoder = self.encoder.encode_map_variant(variant_name, len)?;
248        Ok(SerializeStructVariant::new(encoder))
249    }
250
251    #[inline]
252    fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
253    where
254        T: ?Sized + fmt::Display,
255    {
256        Ok(self.encoder.collect_string(value)?)
257    }
258
259    #[inline]
260    fn is_human_readable(&self) -> bool {
261        TypeId::of::<E::Mode>() == TypeId::of::<Text>()
262    }
263}
264
265#[inline]
266fn encode_variant<E, T, F, O>(encoder: E, variant_tag: &T, f: F) -> Result<O, SerdeError<E::Error>>
267where
268    E: Encoder,
269    T: ?Sized + Serialize,
270    F: FnOnce(<E::EncodeVariant as VariantEncoder>::EncodeData<'_>) -> Result<O, E::Error>,
271{
272    let mut variant = encoder.encode_variant()?;
273    variant_tag.serialize(Serializer::new(variant.encode_tag()?))?;
274    let output = f(variant.encode_data()?)?;
275    variant.finish_variant()?;
276    Ok(output)
277}
278
279pub(super) struct SerializeSeq<E> {
280    encoder: E,
281}
282
283impl<E> SerializeSeq<E> {
284    #[inline]
285    fn new(encoder: E) -> Self {
286        Self { encoder }
287    }
288}
289
290impl<E> ser::SerializeSeq for SerializeSeq<E>
291where
292    E: SequenceEncoder,
293{
294    type Ok = ();
295    type Error = SerdeError<E::Error>;
296
297    #[inline]
298    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
299    where
300        T: ?Sized + ser::Serialize,
301    {
302        let encoder = self.encoder.encode_next()?;
303        value.serialize(Serializer::new(encoder))?;
304        Ok(())
305    }
306
307    #[inline]
308    fn end(self) -> Result<Self::Ok, Self::Error> {
309        Ok(self.encoder.finish_sequence()?)
310    }
311}
312
313impl<E> ser::SerializeTupleStruct for SerializeSeq<E>
314where
315    E: SequenceEncoder,
316{
317    type Ok = ();
318    type Error = SerdeError<E::Error>;
319
320    #[inline]
321    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
322    where
323        T: ?Sized + ser::Serialize,
324    {
325        ser::SerializeSeq::serialize_element(self, value)
326    }
327
328    #[inline]
329    fn end(self) -> Result<Self::Ok, Self::Error> {
330        ser::SerializeSeq::end(self)
331    }
332}
333
334impl<E> ser::SerializeTuple for SerializeSeq<E>
335where
336    E: SequenceEncoder,
337{
338    type Ok = ();
339    type Error = SerdeError<E::Error>;
340
341    #[inline]
342    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
343    where
344        T: ?Sized + ser::Serialize,
345    {
346        ser::SerializeSeq::serialize_element(self, value)
347    }
348
349    #[inline]
350    fn end(self) -> Result<Self::Ok, Self::Error> {
351        ser::SerializeSeq::end(self)
352    }
353}
354
355impl<E> ser::SerializeTupleVariant for SerializeSeq<E>
356where
357    E: SequenceEncoder,
358{
359    type Ok = ();
360    type Error = SerdeError<E::Error>;
361
362    #[inline]
363    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
364    where
365        T: ?Sized + ser::Serialize,
366    {
367        ser::SerializeSeq::serialize_element(self, value)
368    }
369
370    #[inline]
371    fn end(self) -> Result<Self::Ok, Self::Error> {
372        ser::SerializeSeq::end(self)
373    }
374}
375
376pub(super) struct SerializeMap<E> {
377    encoder: E,
378}
379
380impl<E> SerializeMap<E> {
381    #[inline]
382    fn new(encoder: E) -> Self {
383        Self { encoder }
384    }
385}
386
387impl<E> ser::SerializeMap for SerializeMap<E>
388where
389    E: EntriesEncoder,
390{
391    type Ok = ();
392    type Error = SerdeError<E::Error>;
393
394    #[inline]
395    fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
396    where
397        T: ?Sized + ser::Serialize,
398    {
399        let encoder = self.encoder.encode_entry_key()?;
400        key.serialize(Serializer::new(encoder))?;
401        Ok(())
402    }
403
404    #[inline]
405    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
406    where
407        T: ?Sized + ser::Serialize,
408    {
409        let encoder = self.encoder.encode_entry_value()?;
410        value.serialize(Serializer::new(encoder))?;
411        Ok(())
412    }
413
414    #[inline]
415    fn end(self) -> Result<Self::Ok, Self::Error> {
416        Ok(self.encoder.finish_entries()?)
417    }
418}
419
420pub(super) struct SerializeStruct<E> {
421    encoder: E,
422}
423
424impl<E> SerializeStruct<E> {
425    #[inline]
426    fn new(encoder: E) -> Self {
427        Self { encoder }
428    }
429}
430
431impl<E> ser::SerializeStruct for SerializeStruct<E>
432where
433    E: MapEncoder,
434{
435    type Ok = ();
436    type Error = SerdeError<E::Error>;
437
438    #[inline]
439    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
440    where
441        T: ?Sized + ser::Serialize,
442    {
443        let mut field = self.encoder.encode_entry()?;
444        field.encode_key()?.encode(key)?;
445        value.serialize(Serializer::new(field.encode_value()?))?;
446        field.finish_entry()?;
447        Ok(())
448    }
449
450    #[inline]
451    fn end(self) -> Result<Self::Ok, Self::Error> {
452        Ok(self.encoder.finish_map()?)
453    }
454}
455
456pub(super) struct SerializeStructVariant<E> {
457    encoder: E,
458}
459
460impl<E> SerializeStructVariant<E> {
461    #[inline]
462    fn new(encoder: E) -> Self {
463        Self { encoder }
464    }
465}
466
467impl<E> ser::SerializeStructVariant for SerializeStructVariant<E>
468where
469    E: MapEncoder,
470{
471    type Ok = ();
472    type Error = SerdeError<E::Error>;
473
474    #[inline]
475    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
476    where
477        T: ?Sized + ser::Serialize,
478    {
479        self.encoder.encode_entry_fn(|field| {
480            let err = err(field.cx());
481            field.encode_key()?.encode(key)?;
482            value
483                .serialize(Serializer::new(field.encode_value()?))
484                .map_err(err)?;
485            Ok(())
486        })?;
487
488        Ok(())
489    }
490
491    #[inline]
492    fn end(self) -> Result<Self::Ok, Self::Error> {
493        Ok(self.encoder.finish_map()?)
494    }
495}