1 use std::io::Write;
2 use std::u32;
3 
4 use serde;
5 
6 use byteorder::WriteBytesExt;
7 
8 use super::config::{IntEncoding, SizeLimit};
9 use super::{Error, ErrorKind, Result};
10 use config::{BincodeByteOrder, Options};
11 use std::mem::size_of;
12 
13 /// An Serializer that encodes values directly into a Writer.
14 ///
15 /// The specified byte-order will impact the endianness that is
16 /// used during the encoding.
17 ///
18 /// This struct should not be used often.
19 /// For most cases, prefer the `encode_into` function.
20 pub struct Serializer<W, O: Options> {
21     writer: W,
22     _options: O,
23 }
24 
25 macro_rules! impl_serialize_literal {
26     ($ser_method:ident($ty:ty) = $write:ident()) => {
27         pub(crate) fn $ser_method(&mut self, v: $ty) -> Result<()> {
28             self.writer
29                 .$write::<<O::Endian as BincodeByteOrder>::Endian>(v)
30                 .map_err(Into::into)
31         }
32     };
33 }
34 
35 impl<W: Write, O: Options> Serializer<W, O> {
36     /// Creates a new Serializer with the given `Write`r.
new(w: W, options: O) -> Serializer<W, O>37     pub fn new(w: W, options: O) -> Serializer<W, O> {
38         Serializer {
39             writer: w,
40             _options: options,
41         }
42     }
43 
serialize_byte(&mut self, v: u8) -> Result<()>44     pub(crate) fn serialize_byte(&mut self, v: u8) -> Result<()> {
45         self.writer.write_u8(v).map_err(Into::into)
46     }
47 
48     impl_serialize_literal! {serialize_literal_u16(u16) = write_u16()}
49     impl_serialize_literal! {serialize_literal_u32(u32) = write_u32()}
50     impl_serialize_literal! {serialize_literal_u64(u64) = write_u64()}
51 
52     serde_if_integer128! {
53         impl_serialize_literal!{serialize_literal_u128(u128) = write_u128()}
54     }
55 }
56 
57 macro_rules! impl_serialize_int {
58     ($ser_method:ident($ty:ty) = $ser_int:ident()) => {
59         fn $ser_method(self, v: $ty) -> Result<()> {
60             O::IntEncoding::$ser_int(self, v)
61         }
62     };
63 }
64 
65 impl<'a, W: Write, O: Options> serde::Serializer for &'a mut Serializer<W, O> {
66     type Ok = ();
67     type Error = Error;
68     type SerializeSeq = Compound<'a, W, O>;
69     type SerializeTuple = Compound<'a, W, O>;
70     type SerializeTupleStruct = Compound<'a, W, O>;
71     type SerializeTupleVariant = Compound<'a, W, O>;
72     type SerializeMap = Compound<'a, W, O>;
73     type SerializeStruct = Compound<'a, W, O>;
74     type SerializeStructVariant = Compound<'a, W, O>;
75 
serialize_unit(self) -> Result<()>76     fn serialize_unit(self) -> Result<()> {
77         Ok(())
78     }
79 
serialize_unit_struct(self, _: &'static str) -> Result<()>80     fn serialize_unit_struct(self, _: &'static str) -> Result<()> {
81         Ok(())
82     }
83 
serialize_bool(self, v: bool) -> Result<()>84     fn serialize_bool(self, v: bool) -> Result<()> {
85         self.serialize_byte(v as u8)
86     }
87 
serialize_u8(self, v: u8) -> Result<()>88     fn serialize_u8(self, v: u8) -> Result<()> {
89         self.serialize_byte(v)
90     }
91 
92     impl_serialize_int! {serialize_u16(u16) = serialize_u16()}
93     impl_serialize_int! {serialize_u32(u32) = serialize_u32()}
94     impl_serialize_int! {serialize_u64(u64) = serialize_u64()}
95 
serialize_i8(self, v: i8) -> Result<()>96     fn serialize_i8(self, v: i8) -> Result<()> {
97         self.serialize_byte(v as u8)
98     }
99 
100     impl_serialize_int! {serialize_i16(i16) = serialize_i16()}
101     impl_serialize_int! {serialize_i32(i32) = serialize_i32()}
102     impl_serialize_int! {serialize_i64(i64) = serialize_i64()}
103 
104     serde_if_integer128! {
105         impl_serialize_int!{serialize_u128(u128) = serialize_u128()}
106         impl_serialize_int!{serialize_i128(i128) = serialize_i128()}
107     }
108 
serialize_f32(self, v: f32) -> Result<()>109     fn serialize_f32(self, v: f32) -> Result<()> {
110         self.writer
111             .write_f32::<<O::Endian as BincodeByteOrder>::Endian>(v)
112             .map_err(Into::into)
113     }
114 
serialize_f64(self, v: f64) -> Result<()>115     fn serialize_f64(self, v: f64) -> Result<()> {
116         self.writer
117             .write_f64::<<O::Endian as BincodeByteOrder>::Endian>(v)
118             .map_err(Into::into)
119     }
120 
serialize_str(self, v: &str) -> Result<()>121     fn serialize_str(self, v: &str) -> Result<()> {
122         O::IntEncoding::serialize_len(self, v.len())?;
123         self.writer.write_all(v.as_bytes()).map_err(Into::into)
124     }
125 
serialize_char(self, c: char) -> Result<()>126     fn serialize_char(self, c: char) -> Result<()> {
127         self.writer
128             .write_all(encode_utf8(c).as_slice())
129             .map_err(Into::into)
130     }
131 
serialize_bytes(self, v: &[u8]) -> Result<()>132     fn serialize_bytes(self, v: &[u8]) -> Result<()> {
133         O::IntEncoding::serialize_len(self, v.len())?;
134         self.writer.write_all(v).map_err(Into::into)
135     }
136 
serialize_none(self) -> Result<()>137     fn serialize_none(self) -> Result<()> {
138         self.writer.write_u8(0).map_err(Into::into)
139     }
140 
serialize_some<T: ?Sized>(self, v: &T) -> Result<()> where T: serde::Serialize,141     fn serialize_some<T: ?Sized>(self, v: &T) -> Result<()>
142     where
143         T: serde::Serialize,
144     {
145         self.writer.write_u8(1)?;
146         v.serialize(self)
147     }
148 
serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq>149     fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
150         let len = len.ok_or(ErrorKind::SequenceMustHaveLength)?;
151         O::IntEncoding::serialize_len(self, len)?;
152         Ok(Compound { ser: self })
153     }
154 
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple>155     fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
156         Ok(Compound { ser: self })
157     }
158 
serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct>159     fn serialize_tuple_struct(
160         self,
161         _name: &'static str,
162         _len: usize,
163     ) -> Result<Self::SerializeTupleStruct> {
164         Ok(Compound { ser: self })
165     }
166 
serialize_tuple_variant( self, _name: &'static str, variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant>167     fn serialize_tuple_variant(
168         self,
169         _name: &'static str,
170         variant_index: u32,
171         _variant: &'static str,
172         _len: usize,
173     ) -> Result<Self::SerializeTupleVariant> {
174         O::IntEncoding::serialize_u32(self, variant_index)?;
175         Ok(Compound { ser: self })
176     }
177 
serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap>178     fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
179         let len = len.ok_or(ErrorKind::SequenceMustHaveLength)?;
180         O::IntEncoding::serialize_len(self, len)?;
181         Ok(Compound { ser: self })
182     }
183 
serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct>184     fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
185         Ok(Compound { ser: self })
186     }
187 
serialize_struct_variant( self, _name: &'static str, variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant>188     fn serialize_struct_variant(
189         self,
190         _name: &'static str,
191         variant_index: u32,
192         _variant: &'static str,
193         _len: usize,
194     ) -> Result<Self::SerializeStructVariant> {
195         O::IntEncoding::serialize_u32(self, variant_index)?;
196         Ok(Compound { ser: self })
197     }
198 
serialize_newtype_struct<T: ?Sized>(self, _name: &'static str, value: &T) -> Result<()> where T: serde::ser::Serialize,199     fn serialize_newtype_struct<T: ?Sized>(self, _name: &'static str, value: &T) -> Result<()>
200     where
201         T: serde::ser::Serialize,
202     {
203         value.serialize(self)
204     }
205 
serialize_newtype_variant<T: ?Sized>( self, _name: &'static str, variant_index: u32, _variant: &'static str, value: &T, ) -> Result<()> where T: serde::ser::Serialize,206     fn serialize_newtype_variant<T: ?Sized>(
207         self,
208         _name: &'static str,
209         variant_index: u32,
210         _variant: &'static str,
211         value: &T,
212     ) -> Result<()>
213     where
214         T: serde::ser::Serialize,
215     {
216         O::IntEncoding::serialize_u32(self, variant_index)?;
217         value.serialize(self)
218     }
219 
serialize_unit_variant( self, _name: &'static str, variant_index: u32, _variant: &'static str, ) -> Result<()>220     fn serialize_unit_variant(
221         self,
222         _name: &'static str,
223         variant_index: u32,
224         _variant: &'static str,
225     ) -> Result<()> {
226         O::IntEncoding::serialize_u32(self, variant_index)
227     }
228 
is_human_readable(&self) -> bool229     fn is_human_readable(&self) -> bool {
230         false
231     }
232 }
233 
234 pub(crate) struct SizeChecker<O: Options> {
235     pub options: O,
236     pub total: u64,
237 }
238 
239 impl<O: Options> SizeChecker<O> {
add_raw(&mut self, size: u64) -> Result<()>240     fn add_raw(&mut self, size: u64) -> Result<()> {
241         self.options.limit().add(size)?;
242         self.total += size;
243 
244         Ok(())
245     }
246 
add_discriminant(&mut self, idx: u32) -> Result<()>247     fn add_discriminant(&mut self, idx: u32) -> Result<()> {
248         let bytes = O::IntEncoding::u32_size(idx);
249         self.add_raw(bytes)
250     }
251 
add_len(&mut self, len: usize) -> Result<()>252     fn add_len(&mut self, len: usize) -> Result<()> {
253         let bytes = O::IntEncoding::len_size(len);
254         self.add_raw(bytes)
255     }
256 }
257 
258 macro_rules! impl_size_int {
259     ($ser_method:ident($ty:ty) = $size_method:ident()) => {
260         fn $ser_method(self, v: $ty) -> Result<()> {
261             self.add_raw(O::IntEncoding::$size_method(v))
262         }
263     };
264 }
265 
266 impl<'a, O: Options> serde::Serializer for &'a mut SizeChecker<O> {
267     type Ok = ();
268     type Error = Error;
269     type SerializeSeq = SizeCompound<'a, O>;
270     type SerializeTuple = SizeCompound<'a, O>;
271     type SerializeTupleStruct = SizeCompound<'a, O>;
272     type SerializeTupleVariant = SizeCompound<'a, O>;
273     type SerializeMap = SizeCompound<'a, O>;
274     type SerializeStruct = SizeCompound<'a, O>;
275     type SerializeStructVariant = SizeCompound<'a, O>;
276 
serialize_unit(self) -> Result<()>277     fn serialize_unit(self) -> Result<()> {
278         Ok(())
279     }
280 
serialize_unit_struct(self, _: &'static str) -> Result<()>281     fn serialize_unit_struct(self, _: &'static str) -> Result<()> {
282         Ok(())
283     }
284 
serialize_bool(self, _: bool) -> Result<()>285     fn serialize_bool(self, _: bool) -> Result<()> {
286         self.add_raw(1)
287     }
288 
serialize_u8(self, _: u8) -> Result<()>289     fn serialize_u8(self, _: u8) -> Result<()> {
290         self.add_raw(1)
291     }
serialize_i8(self, _: i8) -> Result<()>292     fn serialize_i8(self, _: i8) -> Result<()> {
293         self.add_raw(1)
294     }
295 
296     impl_size_int! {serialize_u16(u16) = u16_size()}
297     impl_size_int! {serialize_u32(u32) = u32_size()}
298     impl_size_int! {serialize_u64(u64) = u64_size()}
299     impl_size_int! {serialize_i16(i16) = i16_size()}
300     impl_size_int! {serialize_i32(i32) = i32_size()}
301     impl_size_int! {serialize_i64(i64) = i64_size()}
302 
303     serde_if_integer128! {
304         impl_size_int!{serialize_u128(u128) = u128_size()}
305         impl_size_int!{serialize_i128(i128) = i128_size()}
306     }
307 
serialize_f32(self, _: f32) -> Result<()>308     fn serialize_f32(self, _: f32) -> Result<()> {
309         self.add_raw(size_of::<f32>() as u64)
310     }
311 
serialize_f64(self, _: f64) -> Result<()>312     fn serialize_f64(self, _: f64) -> Result<()> {
313         self.add_raw(size_of::<f64>() as u64)
314     }
315 
serialize_str(self, v: &str) -> Result<()>316     fn serialize_str(self, v: &str) -> Result<()> {
317         self.add_len(v.len())?;
318         self.add_raw(v.len() as u64)
319     }
320 
serialize_char(self, c: char) -> Result<()>321     fn serialize_char(self, c: char) -> Result<()> {
322         self.add_raw(encode_utf8(c).as_slice().len() as u64)
323     }
324 
serialize_bytes(self, v: &[u8]) -> Result<()>325     fn serialize_bytes(self, v: &[u8]) -> Result<()> {
326         self.add_len(v.len())?;
327         self.add_raw(v.len() as u64)
328     }
329 
serialize_none(self) -> Result<()>330     fn serialize_none(self) -> Result<()> {
331         self.add_raw(1)
332     }
333 
serialize_some<T: ?Sized>(self, v: &T) -> Result<()> where T: serde::Serialize,334     fn serialize_some<T: ?Sized>(self, v: &T) -> Result<()>
335     where
336         T: serde::Serialize,
337     {
338         self.add_raw(1)?;
339         v.serialize(self)
340     }
341 
serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq>342     fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
343         let len = len.ok_or(ErrorKind::SequenceMustHaveLength)?;
344 
345         self.add_len(len)?;
346         Ok(SizeCompound { ser: self })
347     }
348 
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple>349     fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
350         Ok(SizeCompound { ser: self })
351     }
352 
serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct>353     fn serialize_tuple_struct(
354         self,
355         _name: &'static str,
356         _len: usize,
357     ) -> Result<Self::SerializeTupleStruct> {
358         Ok(SizeCompound { ser: self })
359     }
360 
serialize_tuple_variant( self, _name: &'static str, variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant>361     fn serialize_tuple_variant(
362         self,
363         _name: &'static str,
364         variant_index: u32,
365         _variant: &'static str,
366         _len: usize,
367     ) -> Result<Self::SerializeTupleVariant> {
368         self.add_raw(O::IntEncoding::u32_size(variant_index))?;
369         Ok(SizeCompound { ser: self })
370     }
371 
serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap>372     fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
373         let len = len.ok_or(ErrorKind::SequenceMustHaveLength)?;
374 
375         self.add_len(len)?;
376         Ok(SizeCompound { ser: self })
377     }
378 
serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct>379     fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
380         Ok(SizeCompound { ser: self })
381     }
382 
serialize_struct_variant( self, _name: &'static str, variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant>383     fn serialize_struct_variant(
384         self,
385         _name: &'static str,
386         variant_index: u32,
387         _variant: &'static str,
388         _len: usize,
389     ) -> Result<Self::SerializeStructVariant> {
390         self.add_discriminant(variant_index)?;
391         Ok(SizeCompound { ser: self })
392     }
393 
serialize_newtype_struct<V: serde::Serialize + ?Sized>( self, _name: &'static str, v: &V, ) -> Result<()>394     fn serialize_newtype_struct<V: serde::Serialize + ?Sized>(
395         self,
396         _name: &'static str,
397         v: &V,
398     ) -> Result<()> {
399         v.serialize(self)
400     }
401 
serialize_unit_variant( self, _name: &'static str, variant_index: u32, _variant: &'static str, ) -> Result<()>402     fn serialize_unit_variant(
403         self,
404         _name: &'static str,
405         variant_index: u32,
406         _variant: &'static str,
407     ) -> Result<()> {
408         self.add_discriminant(variant_index)
409     }
410 
serialize_newtype_variant<V: serde::Serialize + ?Sized>( self, _name: &'static str, variant_index: u32, _variant: &'static str, value: &V, ) -> Result<()>411     fn serialize_newtype_variant<V: serde::Serialize + ?Sized>(
412         self,
413         _name: &'static str,
414         variant_index: u32,
415         _variant: &'static str,
416         value: &V,
417     ) -> Result<()> {
418         self.add_discriminant(variant_index)?;
419         value.serialize(self)
420     }
421 
is_human_readable(&self) -> bool422     fn is_human_readable(&self) -> bool {
423         false
424     }
425 }
426 
427 pub struct Compound<'a, W: 'a, O: Options + 'a> {
428     ser: &'a mut Serializer<W, O>,
429 }
430 
431 impl<'a, W, O> serde::ser::SerializeSeq for Compound<'a, W, O>
432 where
433     W: Write,
434     O: Options,
435 {
436     type Ok = ();
437     type Error = Error;
438 
439     #[inline]
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: serde::ser::Serialize,440     fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()>
441     where
442         T: serde::ser::Serialize,
443     {
444         value.serialize(&mut *self.ser)
445     }
446 
447     #[inline]
end(self) -> Result<()>448     fn end(self) -> Result<()> {
449         Ok(())
450     }
451 }
452 
453 impl<'a, W, O> serde::ser::SerializeTuple for Compound<'a, W, O>
454 where
455     W: Write,
456     O: Options,
457 {
458     type Ok = ();
459     type Error = Error;
460 
461     #[inline]
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: serde::ser::Serialize,462     fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()>
463     where
464         T: serde::ser::Serialize,
465     {
466         value.serialize(&mut *self.ser)
467     }
468 
469     #[inline]
end(self) -> Result<()>470     fn end(self) -> Result<()> {
471         Ok(())
472     }
473 }
474 
475 impl<'a, W, O> serde::ser::SerializeTupleStruct for Compound<'a, W, O>
476 where
477     W: Write,
478     O: Options,
479 {
480     type Ok = ();
481     type Error = Error;
482 
483     #[inline]
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: serde::ser::Serialize,484     fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()>
485     where
486         T: serde::ser::Serialize,
487     {
488         value.serialize(&mut *self.ser)
489     }
490 
491     #[inline]
end(self) -> Result<()>492     fn end(self) -> Result<()> {
493         Ok(())
494     }
495 }
496 
497 impl<'a, W, O> serde::ser::SerializeTupleVariant for Compound<'a, W, O>
498 where
499     W: Write,
500     O: Options,
501 {
502     type Ok = ();
503     type Error = Error;
504 
505     #[inline]
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: serde::ser::Serialize,506     fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()>
507     where
508         T: serde::ser::Serialize,
509     {
510         value.serialize(&mut *self.ser)
511     }
512 
513     #[inline]
end(self) -> Result<()>514     fn end(self) -> Result<()> {
515         Ok(())
516     }
517 }
518 
519 impl<'a, W, O> serde::ser::SerializeMap for Compound<'a, W, O>
520 where
521     W: Write,
522     O: Options,
523 {
524     type Ok = ();
525     type Error = Error;
526 
527     #[inline]
serialize_key<K: ?Sized>(&mut self, value: &K) -> Result<()> where K: serde::ser::Serialize,528     fn serialize_key<K: ?Sized>(&mut self, value: &K) -> Result<()>
529     where
530         K: serde::ser::Serialize,
531     {
532         value.serialize(&mut *self.ser)
533     }
534 
535     #[inline]
serialize_value<V: ?Sized>(&mut self, value: &V) -> Result<()> where V: serde::ser::Serialize,536     fn serialize_value<V: ?Sized>(&mut self, value: &V) -> Result<()>
537     where
538         V: serde::ser::Serialize,
539     {
540         value.serialize(&mut *self.ser)
541     }
542 
543     #[inline]
end(self) -> Result<()>544     fn end(self) -> Result<()> {
545         Ok(())
546     }
547 }
548 
549 impl<'a, W, O> serde::ser::SerializeStruct for Compound<'a, W, O>
550 where
551     W: Write,
552     O: Options,
553 {
554     type Ok = ();
555     type Error = Error;
556 
557     #[inline]
serialize_field<T: ?Sized>(&mut self, _key: &'static str, value: &T) -> Result<()> where T: serde::ser::Serialize,558     fn serialize_field<T: ?Sized>(&mut self, _key: &'static str, value: &T) -> Result<()>
559     where
560         T: serde::ser::Serialize,
561     {
562         value.serialize(&mut *self.ser)
563     }
564 
565     #[inline]
end(self) -> Result<()>566     fn end(self) -> Result<()> {
567         Ok(())
568     }
569 }
570 
571 impl<'a, W, O> serde::ser::SerializeStructVariant for Compound<'a, W, O>
572 where
573     W: Write,
574     O: Options,
575 {
576     type Ok = ();
577     type Error = Error;
578 
579     #[inline]
serialize_field<T: ?Sized>(&mut self, _key: &'static str, value: &T) -> Result<()> where T: serde::ser::Serialize,580     fn serialize_field<T: ?Sized>(&mut self, _key: &'static str, value: &T) -> Result<()>
581     where
582         T: serde::ser::Serialize,
583     {
584         value.serialize(&mut *self.ser)
585     }
586 
587     #[inline]
end(self) -> Result<()>588     fn end(self) -> Result<()> {
589         Ok(())
590     }
591 }
592 
593 pub(crate) struct SizeCompound<'a, S: Options + 'a> {
594     ser: &'a mut SizeChecker<S>,
595 }
596 
597 impl<'a, O: Options> serde::ser::SerializeSeq for SizeCompound<'a, O> {
598     type Ok = ();
599     type Error = Error;
600 
601     #[inline]
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: serde::ser::Serialize,602     fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()>
603     where
604         T: serde::ser::Serialize,
605     {
606         value.serialize(&mut *self.ser)
607     }
608 
609     #[inline]
end(self) -> Result<()>610     fn end(self) -> Result<()> {
611         Ok(())
612     }
613 }
614 
615 impl<'a, O: Options> serde::ser::SerializeTuple for SizeCompound<'a, O> {
616     type Ok = ();
617     type Error = Error;
618 
619     #[inline]
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: serde::ser::Serialize,620     fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()>
621     where
622         T: serde::ser::Serialize,
623     {
624         value.serialize(&mut *self.ser)
625     }
626 
627     #[inline]
end(self) -> Result<()>628     fn end(self) -> Result<()> {
629         Ok(())
630     }
631 }
632 
633 impl<'a, O: Options> serde::ser::SerializeTupleStruct for SizeCompound<'a, O> {
634     type Ok = ();
635     type Error = Error;
636 
637     #[inline]
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: serde::ser::Serialize,638     fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()>
639     where
640         T: serde::ser::Serialize,
641     {
642         value.serialize(&mut *self.ser)
643     }
644 
645     #[inline]
end(self) -> Result<()>646     fn end(self) -> Result<()> {
647         Ok(())
648     }
649 }
650 
651 impl<'a, O: Options> serde::ser::SerializeTupleVariant for SizeCompound<'a, O> {
652     type Ok = ();
653     type Error = Error;
654 
655     #[inline]
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: serde::ser::Serialize,656     fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()>
657     where
658         T: serde::ser::Serialize,
659     {
660         value.serialize(&mut *self.ser)
661     }
662 
663     #[inline]
end(self) -> Result<()>664     fn end(self) -> Result<()> {
665         Ok(())
666     }
667 }
668 
669 impl<'a, O: Options + 'a> serde::ser::SerializeMap for SizeCompound<'a, O> {
670     type Ok = ();
671     type Error = Error;
672 
673     #[inline]
serialize_key<K: ?Sized>(&mut self, value: &K) -> Result<()> where K: serde::ser::Serialize,674     fn serialize_key<K: ?Sized>(&mut self, value: &K) -> Result<()>
675     where
676         K: serde::ser::Serialize,
677     {
678         value.serialize(&mut *self.ser)
679     }
680 
681     #[inline]
serialize_value<V: ?Sized>(&mut self, value: &V) -> Result<()> where V: serde::ser::Serialize,682     fn serialize_value<V: ?Sized>(&mut self, value: &V) -> Result<()>
683     where
684         V: serde::ser::Serialize,
685     {
686         value.serialize(&mut *self.ser)
687     }
688 
689     #[inline]
end(self) -> Result<()>690     fn end(self) -> Result<()> {
691         Ok(())
692     }
693 }
694 
695 impl<'a, O: Options> serde::ser::SerializeStruct for SizeCompound<'a, O> {
696     type Ok = ();
697     type Error = Error;
698 
699     #[inline]
serialize_field<T: ?Sized>(&mut self, _key: &'static str, value: &T) -> Result<()> where T: serde::ser::Serialize,700     fn serialize_field<T: ?Sized>(&mut self, _key: &'static str, value: &T) -> Result<()>
701     where
702         T: serde::ser::Serialize,
703     {
704         value.serialize(&mut *self.ser)
705     }
706 
707     #[inline]
end(self) -> Result<()>708     fn end(self) -> Result<()> {
709         Ok(())
710     }
711 }
712 
713 impl<'a, O: Options> serde::ser::SerializeStructVariant for SizeCompound<'a, O> {
714     type Ok = ();
715     type Error = Error;
716 
717     #[inline]
serialize_field<T: ?Sized>(&mut self, _key: &'static str, value: &T) -> Result<()> where T: serde::ser::Serialize,718     fn serialize_field<T: ?Sized>(&mut self, _key: &'static str, value: &T) -> Result<()>
719     where
720         T: serde::ser::Serialize,
721     {
722         value.serialize(&mut *self.ser)
723     }
724 
725     #[inline]
end(self) -> Result<()>726     fn end(self) -> Result<()> {
727         Ok(())
728     }
729 }
730 const TAG_CONT: u8 = 0b1000_0000;
731 const TAG_TWO_B: u8 = 0b1100_0000;
732 const TAG_THREE_B: u8 = 0b1110_0000;
733 const TAG_FOUR_B: u8 = 0b1111_0000;
734 const MAX_ONE_B: u32 = 0x80;
735 const MAX_TWO_B: u32 = 0x800;
736 const MAX_THREE_B: u32 = 0x10000;
737 
encode_utf8(c: char) -> EncodeUtf8738 fn encode_utf8(c: char) -> EncodeUtf8 {
739     let code = c as u32;
740     let mut buf = [0; 4];
741     let pos = if code < MAX_ONE_B {
742         buf[3] = code as u8;
743         3
744     } else if code < MAX_TWO_B {
745         buf[2] = (code >> 6 & 0x1F) as u8 | TAG_TWO_B;
746         buf[3] = (code & 0x3F) as u8 | TAG_CONT;
747         2
748     } else if code < MAX_THREE_B {
749         buf[1] = (code >> 12 & 0x0F) as u8 | TAG_THREE_B;
750         buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
751         buf[3] = (code & 0x3F) as u8 | TAG_CONT;
752         1
753     } else {
754         buf[0] = (code >> 18 & 0x07) as u8 | TAG_FOUR_B;
755         buf[1] = (code >> 12 & 0x3F) as u8 | TAG_CONT;
756         buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
757         buf[3] = (code & 0x3F) as u8 | TAG_CONT;
758         0
759     };
760     EncodeUtf8 { buf, pos }
761 }
762 
763 struct EncodeUtf8 {
764     buf: [u8; 4],
765     pos: usize,
766 }
767 
768 impl EncodeUtf8 {
as_slice(&self) -> &[u8]769     fn as_slice(&self) -> &[u8] {
770         &self.buf[self.pos..]
771     }
772 }
773