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