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