1mod pp;
2use crate::{Error, ErrorType};
3pub use pp::*;
4use serde_ext::ser;
5use std::io::Write;
6use std::str;
7use value_trait::generator::BaseGenerator;
8
9macro_rules! iomap {
10 ($e:expr) => {
11 ($e).map_err(|err| Error::generic(ErrorType::Io(err)))
12 };
13}
14
15#[cfg_attr(not(feature = "no-inline"), inline)]
19pub fn to_vec<T>(to: &T) -> crate::Result<Vec<u8>>
20where
21 T: ser::Serialize + ?Sized,
22{
23 let v = Vec::with_capacity(512);
24 let mut s = Serializer(v);
25 to.serialize(&mut s).map(|()| s.0)
26}
27
28#[cfg_attr(not(feature = "no-inline"), inline)]
33pub fn to_string<T>(to: &T) -> crate::Result<String>
34where
35 T: ser::Serialize + ?Sized,
36{
37 to_vec(to).map(|v| unsafe { String::from_utf8_unchecked(v) })
38}
39
40#[cfg_attr(not(feature = "no-inline"), inline)]
44pub fn to_writer<T, W>(writer: W, to: &T) -> crate::Result<()>
45where
46 T: ser::Serialize + ?Sized,
47 W: Write,
48{
49 let mut s = Serializer(writer);
50 to.serialize(&mut s)
51}
52struct Serializer<W: Write>(W);
53
54impl<W> BaseGenerator for Serializer<W>
55where
56 W: Write,
57{
58 type T = W;
59 #[cfg_attr(not(feature = "no-inline"), inline)]
60 fn get_writer(&mut self) -> &mut Self::T {
61 &mut self.0
62 }
63 #[cfg_attr(not(feature = "no-inline"), inline)]
64 fn write_min(&mut self, _slice: &[u8], min: u8) -> std::io::Result<()> {
65 self.0.write_all(&[min])
66 }
67}
68struct SerializeSeq<'serializer, W: Write + 'serializer> {
69 s: &'serializer mut Serializer<W>,
70 first: bool,
71}
72impl<'serializer, W> ser::SerializeSeq for SerializeSeq<'serializer, W>
73where
74 W: Write,
75{
76 type Ok = ();
77 type Error = Error;
78 #[cfg_attr(not(feature = "no-inline"), inline)]
79 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
80 where
81 T: ?Sized + serde_ext::Serialize,
82 {
83 let SerializeSeq {
84 ref mut s,
85 ref mut first,
86 ..
87 } = *self;
88 if *first {
89 *first = false;
90 value.serialize(&mut **s)
91 } else {
92 iomap!(s.write(b",")).and_then(|()| value.serialize(&mut **s))
93 }
94 }
95 #[cfg_attr(not(feature = "no-inline"), inline)]
96 fn end(self) -> Result<Self::Ok, Self::Error> {
97 if self.first {
98 Ok(())
99 } else {
100 iomap!(self.s.write(b"]"))
101 }
102 }
103}
104
105impl<'serializer, W> ser::SerializeTuple for SerializeSeq<'serializer, W>
106where
107 W: Write,
108{
109 type Ok = ();
110 type Error = Error;
111 #[cfg_attr(not(feature = "no-inline"), inline)]
112 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
113 where
114 T: ?Sized + serde_ext::Serialize,
115 {
116 let SerializeSeq {
117 ref mut s,
118 ref mut first,
119 } = *self;
120 if *first {
121 *first = false;
122 value.serialize(&mut **s)
123 } else {
124 iomap!(s.write(b",")).and_then(|()| value.serialize(&mut **s))
125 }
126 }
127 #[cfg_attr(not(feature = "no-inline"), inline)]
128 fn end(self) -> Result<Self::Ok, Self::Error> {
129 if self.first {
130 Ok(())
131 } else {
132 iomap!(self.s.write(b"]"))
133 }
134 }
135}
136
137impl<'serializer, W> ser::SerializeTupleStruct for SerializeSeq<'serializer, W>
138where
139 W: Write,
140{
141 type Ok = ();
142 type Error = Error;
143 #[cfg_attr(not(feature = "no-inline"), inline)]
144 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
145 where
146 T: ?Sized + serde_ext::Serialize,
147 {
148 let SerializeSeq {
149 ref mut s,
150 ref mut first,
151 } = *self;
152 if *first {
153 *first = false;
154 value.serialize(&mut **s)
155 } else {
156 iomap!(s.write(b",")).and_then(|()| value.serialize(&mut **s))
157 }
158 }
159 #[cfg_attr(not(feature = "no-inline"), inline)]
160 fn end(self) -> Result<Self::Ok, Self::Error> {
161 if self.first {
162 Ok(())
163 } else {
164 iomap!(self.s.write(b"]"))
165 }
166 }
167}
168
169impl<'serializer, W> ser::SerializeTupleVariant for SerializeSeq<'serializer, W>
170where
171 W: Write,
172{
173 type Ok = ();
174 type Error = Error;
175 #[cfg_attr(not(feature = "no-inline"), inline)]
176 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
177 where
178 T: ?Sized + serde_ext::Serialize,
179 {
180 let SerializeSeq {
181 ref mut s,
182 ref mut first,
183 } = *self;
184 if *first {
185 *first = false;
186 value.serialize(&mut **s)
187 } else {
188 iomap!(s.write(b",")).and_then(|()| value.serialize(&mut **s))
189 }
190 }
191 #[cfg_attr(not(feature = "no-inline"), inline)]
192 fn end(self) -> Result<Self::Ok, Self::Error> {
193 if self.first {
194 Ok(())
195 } else {
196 iomap!(self.s.write(b"]}"))
197 }
198 }
199}
200
201struct SerializeMap<'serializer, W: Write + 'serializer> {
202 s: &'serializer mut Serializer<W>,
203 first: bool,
204 wrote_closing: bool,
205}
206
207impl<'serializer, W> ser::SerializeMap for SerializeMap<'serializer, W>
208where
209 W: Write,
210{
211 type Ok = ();
212 type Error = Error;
213 #[cfg_attr(not(feature = "no-inline"), inline)]
214 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
215 where
216 T: ?Sized + serde_ext::Serialize,
217 {
218 let SerializeMap {
219 ref mut s,
220 ref mut first,
221 ..
222 } = *self;
223
224 if *first {
225 *first = false;
226 key.serialize(MapKeySerializer { s: &mut **s })
227 .and_then(|()| iomap!(s.write(b":")))
228 } else {
229 iomap!(s.write(b","))
230 .and_then(|()| key.serialize(MapKeySerializer { s: &mut **s }))
231 .and_then(|()| iomap!(s.write(b":")))
232 }
233 }
234 #[cfg_attr(not(feature = "no-inline"), inline)]
235 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
236 where
237 T: ?Sized + serde_ext::Serialize,
238 {
239 let SerializeMap { ref mut s, .. } = *self;
240 value.serialize(&mut **s)
241 }
242 #[cfg_attr(not(feature = "no-inline"), inline)]
243 fn end(self) -> Result<Self::Ok, Self::Error> {
244 if self.wrote_closing {
245 Ok(())
246 } else {
247 iomap!(self.s.write(b"}"))
248 }
249 }
250}
251
252fn key_must_be_a_string() -> Error {
253 Error::generic(ErrorType::KeyMustBeAString)
254}
255
256struct MapKeySerializer<'serializer, W: Write + 'serializer> {
257 s: &'serializer mut Serializer<W>,
258}
259
260impl<'serializer, W> ser::Serializer for MapKeySerializer<'serializer, W>
261where
262 W: Write,
263{
264 type Ok = ();
265 type Error = Error;
266
267 #[cfg_attr(not(feature = "no-inline"), inline)]
268 fn serialize_str(self, value: &str) -> Result<(), Self::Error> {
269 self.s.serialize_str(value)
270 }
271
272 #[cfg_attr(not(feature = "no-inline"), inline)]
273 fn serialize_unit_variant(
274 self,
275 _name: &'static str,
276 _variant_index: u32,
277 variant: &'static str,
278 ) -> Result<(), Self::Error> {
279 self.s.serialize_str(variant)
280 }
281
282 #[cfg_attr(not(feature = "no-inline"), inline)]
283 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<(), Self::Error>
284 where
285 T: ?Sized + serde_ext::Serialize,
286 {
287 value.serialize(self)
288 }
289
290 type SerializeSeq = ser::Impossible<(), Error>;
291 type SerializeTuple = ser::Impossible<(), Error>;
292 type SerializeTupleStruct = ser::Impossible<(), Error>;
293 type SerializeTupleVariant = ser::Impossible<(), Error>;
294 type SerializeMap = ser::Impossible<(), Error>;
295 type SerializeStruct = ser::Impossible<(), Error>;
296 type SerializeStructVariant = ser::Impossible<(), Error>;
297
298 fn serialize_bool(self, _value: bool) -> Result<(), Self::Error> {
299 Err(key_must_be_a_string())
300 }
301
302 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
303 iomap!(self
304 .s
305 .write_char(b'"')
306 .and_then(|()| self.s.write_int(v))
307 .and_then(|()| self.s.write_char(b'"')))
308 }
309
310 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
311 iomap!(self
312 .s
313 .write_char(b'"')
314 .and_then(|()| self.s.write_int(v))
315 .and_then(|()| self.s.write_char(b'"')))
316 }
317
318 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
319 iomap!(self
320 .s
321 .write_char(b'"')
322 .and_then(|()| self.s.write_int(v))
323 .and_then(|()| self.s.write_char(b'"')))
324 }
325
326 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
327 iomap!(self
328 .s
329 .write_char(b'"')
330 .and_then(|()| self.s.write_int(v))
331 .and_then(|()| self.s.write_char(b'"')))
332 }
333
334 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
335 iomap!(self
336 .s
337 .write_char(b'"')
338 .and_then(|()| self.s.write_int(v))
339 .and_then(|()| self.s.write_char(b'"')))
340 }
341
342 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
343 iomap!(self
344 .s
345 .write_char(b'"')
346 .and_then(|()| self.s.write_int(v))
347 .and_then(|()| self.s.write_char(b'"')))
348 }
349
350 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
351 iomap!(self
352 .s
353 .write_char(b'"')
354 .and_then(|()| self.s.write_int(v))
355 .and_then(|()| self.s.write_char(b'"')))
356 }
357
358 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
359 iomap!(self
360 .s
361 .write_char(b'"')
362 .and_then(|()| self.s.write_int(v))
363 .and_then(|()| self.s.write_char(b'"')))
364 }
365
366 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
367 iomap!(self
368 .s
369 .write_char(b'"')
370 .and_then(|()| self.s.write_int(v))
371 .and_then(|()| self.s.write_char(b'"')))
372 }
373
374 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
375 iomap!(self
376 .s
377 .write_char(b'"')
378 .and_then(|()| self.s.write_int(v))
379 .and_then(|()| self.s.write_char(b'"')))
380 }
381
382 fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Self::Error> {
383 Err(key_must_be_a_string())
384 }
385
386 fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Self::Error> {
387 Err(key_must_be_a_string())
388 }
389
390 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
391 self.s.serialize_str(&v.to_string())
392 }
393
394 fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok, Self::Error> {
395 Err(key_must_be_a_string())
396 }
397
398 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
399 Err(key_must_be_a_string())
400 }
401
402 fn serialize_some<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
403 where
404 T: ?Sized + serde_ext::Serialize,
405 {
406 Err(key_must_be_a_string())
407 }
408
409 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
410 Err(key_must_be_a_string())
411 }
412
413 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
414 Err(key_must_be_a_string())
415 }
416
417 fn serialize_newtype_variant<T>(
418 self,
419 _name: &'static str,
420 _variant_index: u32,
421 _variant: &'static str,
422 _value: &T,
423 ) -> Result<Self::Ok, Self::Error>
424 where
425 T: ?Sized + serde_ext::Serialize,
426 {
427 Err(key_must_be_a_string())
428 }
429
430 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
431 Err(key_must_be_a_string())
432 }
433
434 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
435 Err(key_must_be_a_string())
436 }
437
438 fn serialize_tuple_struct(
439 self,
440 _name: &'static str,
441 _len: usize,
442 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
443 Err(key_must_be_a_string())
444 }
445
446 fn serialize_tuple_variant(
447 self,
448 _name: &'static str,
449 _variant_index: u32,
450 _variant: &'static str,
451 _len: usize,
452 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
453 Err(key_must_be_a_string())
454 }
455
456 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
457 Err(key_must_be_a_string())
458 }
459
460 fn serialize_struct(
461 self,
462 _name: &'static str,
463 _len: usize,
464 ) -> Result<Self::SerializeStruct, Self::Error> {
465 Err(key_must_be_a_string())
466 }
467
468 fn serialize_struct_variant(
469 self,
470 _name: &'static str,
471 _variant_index: u32,
472 _variant: &'static str,
473 _len: usize,
474 ) -> Result<Self::SerializeStructVariant, Self::Error> {
475 Err(key_must_be_a_string())
476 }
477}
478
479impl<'serializer, W> ser::SerializeStruct for SerializeMap<'serializer, W>
480where
481 W: Write,
482{
483 type Ok = ();
484 type Error = Error;
485 #[cfg_attr(not(feature = "no-inline"), inline)]
486 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
487 where
488 T: ?Sized + serde_ext::Serialize,
489 {
490 let SerializeMap {
491 ref mut s,
492 ref mut first,
493 ..
494 } = *self;
495 if *first {
496 *first = false;
497 iomap!(s.write_simple_string(key).and_then(|()| s.write(b":")))
498 .and_then(|()| value.serialize(&mut **s))
499 } else {
500 iomap!(s
501 .write(b",")
502 .and_then(|()| s.write_simple_string(key))
503 .and_then(|()| s.write(b":")))
504 .and_then(|()| value.serialize(&mut **s))
505 }
506 }
507 #[cfg_attr(not(feature = "no-inline"), inline)]
508 fn end(self) -> Result<Self::Ok, Self::Error> {
509 if self.first {
510 Ok(())
511 } else {
512 iomap!(self.s.write(b"}"))
513 }
514 }
515}
516
517struct SerializeStructVariant<'serializer, W: Write + 'serializer> {
518 s: &'serializer mut Serializer<W>,
519 first: bool,
520}
521
522impl<'serializer, W> ser::SerializeStructVariant for SerializeStructVariant<'serializer, W>
523where
524 W: Write,
525{
526 type Ok = ();
527 type Error = Error;
528 #[cfg_attr(not(feature = "no-inline"), inline)]
529 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
530 where
531 T: ?Sized + serde_ext::Serialize,
532 {
533 let SerializeStructVariant {
534 ref mut s,
535 ref mut first,
536 ..
537 } = *self;
538 if *first {
539 *first = false;
540 iomap!(s.write_simple_string(key).and_then(|()| s.write(b":")))
541 .and_then(|()| value.serialize(&mut **s))
542 } else {
543 iomap!(s
544 .write(b",")
545 .and_then(|()| s.write_simple_string(key))
546 .and_then(|()| s.write(b":")))
547 .and_then(|()| value.serialize(&mut **s))
548 }
549 }
550 #[cfg_attr(not(feature = "no-inline"), inline)]
551 fn end(self) -> Result<Self::Ok, Self::Error> {
552 iomap!(self.s.write(b"}")).and_then(move |()| {
553 if self.first {
554 Ok(())
555 } else {
556 iomap!(self.s.write(b"}"))
557 }
558 })
559 }
560}
561
562impl<'writer, W> ser::Serializer for &'writer mut Serializer<W>
563where
564 W: Write,
565{
566 type Ok = ();
567 type Error = Error;
568 type SerializeSeq = SerializeSeq<'writer, W>;
569 type SerializeTuple = SerializeSeq<'writer, W>;
570 type SerializeTupleStruct = SerializeSeq<'writer, W>;
571 type SerializeTupleVariant = SerializeSeq<'writer, W>;
572 type SerializeMap = SerializeMap<'writer, W>;
573 type SerializeStruct = SerializeMap<'writer, W>;
574 type SerializeStructVariant = SerializeStructVariant<'writer, W>;
575 #[cfg_attr(not(feature = "no-inline"), inline)]
576 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
577 if v {
578 iomap!(self.write(b"true"))
579 } else {
580 iomap!(self.write(b"false"))
581 }
582 }
583 #[cfg_attr(not(feature = "no-inline"), inline)]
584 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
585 iomap!(self.write_int(v))
586 }
587 #[cfg_attr(not(feature = "no-inline"), inline)]
588 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
589 iomap!(self.write_int(v))
590 }
591 #[cfg_attr(not(feature = "no-inline"), inline)]
592 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
593 iomap!(self.write_int(v))
594 }
595 #[cfg_attr(not(feature = "no-inline"), inline)]
596 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
597 iomap!(self.write_int(v))
598 }
599 #[cfg_attr(not(feature = "no-inline"), inline)]
600 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
601 iomap!(self.write_int(v))
602 }
603 #[cfg_attr(not(feature = "no-inline"), inline)]
604 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
605 iomap!(self.write_int(v))
606 }
607 #[cfg_attr(not(feature = "no-inline"), inline)]
608 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
609 iomap!(self.write_int(v))
610 }
611 #[cfg_attr(not(feature = "no-inline"), inline)]
612 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
613 iomap!(self.write_int(v))
614 }
615 #[cfg_attr(not(feature = "no-inline"), inline)]
616 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
617 iomap!(self.write_int(v))
618 }
619 #[cfg_attr(not(feature = "no-inline"), inline)]
620 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
621 iomap!(self.write_int(v))
622 }
623
624 #[cfg_attr(not(feature = "no-inline"), inline)]
625 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
626 iomap!(self.write_float(f64::from(v)))
627 }
628 #[cfg_attr(not(feature = "no-inline"), inline)]
629 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
630 iomap!(self.write_float(v))
631 }
632 #[cfg_attr(not(feature = "no-inline"), inline)]
633 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
634 let mut buf = [0; 4];
637 iomap!(self.write_simple_string(v.encode_utf8(&mut buf)))
638 }
639 #[cfg_attr(not(feature = "no-inline"), inline)]
640 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
641 iomap!(self.write_string(v))
642 }
643 #[cfg_attr(not(feature = "no-inline"), inline)]
644 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
645 iomap!(self.write(b"[").and_then(|()| {
646 if let Some((first, rest)) = v.split_first() {
647 self.write_int(*first).and_then(|()| {
648 for v in rest {
649 self.write(b",").and_then(|()| self.write_int(*v))?;
650 }
651 self.write(b"]")
652 })
653 } else {
654 self.write(b"]")
655 }
656 }))
657 }
658 #[cfg_attr(not(feature = "no-inline"), inline)]
659 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
660 self.serialize_unit()
661 }
662 #[cfg_attr(not(feature = "no-inline"), inline)]
663 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
664 where
665 T: ?Sized + serde_ext::Serialize,
666 {
667 value.serialize(self)
668 }
669 #[cfg_attr(not(feature = "no-inline"), inline)]
670 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
671 iomap!(self.write(b"null"))
672 }
673 #[cfg_attr(not(feature = "no-inline"), inline)]
674 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
675 self.serialize_unit()
676 }
677 #[cfg_attr(not(feature = "no-inline"), inline)]
678 fn serialize_unit_variant(
679 self,
680 _name: &'static str,
681 _variant_index: u32,
682 variant: &'static str,
683 ) -> Result<Self::Ok, Self::Error> {
684 iomap!(self.write_simple_string(variant))
685 }
686
687 #[cfg_attr(not(feature = "no-inline"), inline)]
688 fn serialize_newtype_struct<T>(
689 self,
690 _name: &'static str,
691 value: &T,
692 ) -> Result<Self::Ok, Self::Error>
693 where
694 T: ?Sized + serde_ext::Serialize,
695 {
696 value.serialize(self)
697 }
698
699 #[cfg_attr(not(feature = "no-inline"), inline)]
700 fn serialize_newtype_variant<T>(
701 self,
702 _name: &'static str,
703 _variant_index: u32,
704 variant: &'static str,
705 value: &T,
706 ) -> Result<Self::Ok, Self::Error>
707 where
708 T: ?Sized + serde_ext::Serialize,
709 {
710 iomap!(self
711 .write(b"{")
712 .and_then(|()| self.write_simple_string(variant))
713 .and_then(|()| self.write(b":")))
714 .and_then(|()| value.serialize(&mut *self))
715 .and_then(|()| iomap!(self.write(b"}")))
716 }
717 #[cfg_attr(not(feature = "no-inline"), inline)]
718 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
719 if len == Some(0) {
720 iomap!(self.write(b"[]"))
721 } else {
722 iomap!(self.write(b"["))
723 }
724 .map(move |()| SerializeSeq {
725 s: self,
726 first: true,
727 })
728 }
729
730 #[cfg_attr(not(feature = "no-inline"), inline)]
731 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
732 self.serialize_seq(Some(len))
733 }
734
735 #[cfg_attr(not(feature = "no-inline"), inline)]
736 fn serialize_tuple_struct(
737 self,
738 _name: &'static str,
739 len: usize,
740 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
741 self.serialize_seq(Some(len))
742 }
743
744 #[cfg_attr(not(feature = "no-inline"), inline)]
745 fn serialize_tuple_variant(
746 self,
747 _name: &'static str,
748 _variant_index: u32,
749 variant: &'static str,
750 len: usize,
751 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
752 iomap!(self
753 .write(b"{")
754 .and_then(|()| self.write_simple_string(variant))
755 .and_then(|()| self.write(b":")))?;
756 self.serialize_seq(Some(len))
757 }
758
759 #[cfg_attr(not(feature = "no-inline"), inline)]
760 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
761 let mut wrote_closing = false;
762 if len == Some(0) {
763 wrote_closing = true;
764 iomap!(self.write(b"{}"))
765 } else {
766 iomap!(self.write(b"{"))
767 }
768 .map(move |()| SerializeMap {
769 s: self,
770 first: true,
771 wrote_closing,
772 })
773 }
774
775 #[cfg_attr(not(feature = "no-inline"), inline)]
776 fn serialize_struct(
777 self,
778 _name: &'static str,
779 len: usize,
780 ) -> Result<Self::SerializeStruct, Self::Error> {
781 self.serialize_map(Some(len))
782 }
783
784 #[cfg_attr(not(feature = "no-inline"), inline)]
785 fn serialize_struct_variant(
786 self,
787 _name: &'static str,
788 _variant_index: u32,
789 variant: &'static str,
790 len: usize,
791 ) -> Result<Self::SerializeStructVariant, Self::Error> {
792 iomap!(self
793 .write(b"{")
794 .and_then(|()| self.write_simple_string(variant))
795 .and_then(|()| self.write(b":")))
796 .and_then(move |()| {
797 if len == 0 {
798 iomap!(self.write(b"{}"))
799 } else {
800 iomap!(self.write(b"{"))
801 }
802 .map(move |()| SerializeStructVariant {
803 s: self,
804 first: true,
805 })
806 })
807 }
808}
809
810#[cfg(test)]
811mod test {
812 #![allow(clippy::ignored_unit_patterns)]
813 #[cfg(not(target_arch = "wasm32"))]
814 use crate::{OwnedValue as Value, StaticNode};
815 #[cfg(not(target_arch = "wasm32"))]
816 use proptest::prelude::*;
817
818 #[test]
819 fn enum_tuple() {
820 #[derive(serde::Serialize, Clone)]
821 enum ErrType {
822 Instruction(i64, i64),
823 }
824
825 let err = ErrType::Instruction(2, 68800);
826
827 assert_eq!(
828 crate::to_string(&err).expect("failed to serialize"),
829 "{\"Instruction\":[2,68800]}",
830 );
831 }
832 #[test]
833 fn print_serde() {
834 #[derive(Clone, Debug, PartialEq, serde::Serialize)]
835 enum Segment {
836 Id { mid: usize },
837 }
838
839 assert_eq!(
840 "{\"Id\":{\"mid\":0}}",
841 crate::to_string(&Segment::Id { mid: 0 }).expect("to_string")
842 );
843 }
844
845 #[test]
846 fn numerical_map_serde() {
847 use std::collections::HashMap;
848
849 #[derive(Clone, Debug, PartialEq, serde::Serialize)]
850 struct Foo {
851 pub bar: HashMap<i32, i32>,
852 }
853
854 let mut foo = Foo {
855 bar: HashMap::new(),
856 };
857
858 foo.bar.insert(1337, 1337);
859
860 assert_eq!(
861 r#"{"bar":{"1337":1337}}"#,
862 crate::to_string(&foo).expect("to_string")
863 );
864 }
865
866 #[cfg(not(feature = "128bit"))]
867 #[cfg(not(target_arch = "wasm32"))]
868 fn arb_json_value() -> BoxedStrategy<Value> {
869 let leaf = prop_oneof![
870 Just(Value::Static(StaticNode::Null)),
871 any::<bool>().prop_map(Value::from),
872 any::<i8>().prop_map(Value::from),
874 any::<i16>().prop_map(Value::from),
875 any::<i32>().prop_map(Value::from),
876 any::<i64>().prop_map(Value::from),
877 any::<u8>().prop_map(Value::from),
878 any::<u16>().prop_map(Value::from),
879 any::<u32>().prop_map(Value::from),
880 any::<u64>().prop_map(Value::from),
881 ".*".prop_map(Value::from),
882 ];
883 leaf.prop_recursive(
884 8, 256, 10, |inner| {
888 prop_oneof![
889 prop::collection::vec(inner.clone(), 0..10).prop_map(Value::from),
891 prop::collection::hash_map(".*", inner, 0..10).prop_map(Value::from),
892 ]
893 },
894 )
895 .boxed()
896 }
897
898 #[cfg(feature = "128bit")]
899 #[cfg(not(target_arch = "wasm32"))]
900 fn arb_json_value() -> BoxedStrategy<Value> {
901 let leaf = prop_oneof![
902 Just(Value::Static(StaticNode::Null)),
903 any::<bool>().prop_map(Value::from),
904 any::<i8>().prop_map(Value::from),
906 any::<i16>().prop_map(Value::from),
907 any::<i32>().prop_map(Value::from),
908 any::<i64>().prop_map(Value::from),
909 any::<i128>().prop_map(Value::from),
910 any::<u8>().prop_map(Value::from),
911 any::<u16>().prop_map(Value::from),
912 any::<u32>().prop_map(Value::from),
913 any::<u64>().prop_map(Value::from),
914 any::<u128>().prop_map(Value::from),
915 ".*".prop_map(Value::from),
916 ];
917 leaf.prop_recursive(
918 8, 256, 10, |inner| {
922 prop_oneof![
923 prop::collection::vec(inner.clone(), 0..10).prop_map(Value::from),
925 prop::collection::hash_map(".*", inner, 0..10).prop_map(Value::from),
926 ]
927 },
928 )
929 .boxed()
930 }
931
932 #[cfg(not(target_arch = "wasm32"))]
933 proptest! {
934 #![proptest_config(ProptestConfig {
935 .. ProptestConfig::default()
940 })]
941
942 #[test]
943 fn prop_json_encode_decode(val in arb_json_value()) {
944 let mut encoded = crate::to_vec(&val).expect("to_vec");
945 println!("{}", String::from_utf8_lossy(&encoded.clone()));
946 let res: Value = crate::from_slice(encoded.as_mut_slice()).expect("can't convert");
947 assert_eq!(val, res);
948 }
949 }
950}