blob: 40c94f281313367b5fb7c7eef632a1e32f8ae708 [file] [log] [blame]
Jakub Koturc72d7202020-12-21 17:28:15 +01001use std::fmt;
2use std::io;
3use std::mem;
4
5use itoa;
6use ryu;
7use serde::ser::{
8 Error as SerdeError, Serialize, SerializeMap, SerializeSeq,
9 SerializeStruct, SerializeStructVariant, SerializeTuple,
10 SerializeTupleStruct, SerializeTupleVariant, Serializer,
11};
12use serde::serde_if_integer128;
13
14use crate::error::{Error, ErrorKind};
15use crate::writer::Writer;
16
17/// Serialize the given value to the given writer, and return an error if
18/// anything went wrong.
19pub fn serialize<S: Serialize, W: io::Write>(
20 wtr: &mut Writer<W>,
21 value: S,
22) -> Result<(), Error> {
23 value.serialize(&mut SeRecord { wtr: wtr })
24}
25
26struct SeRecord<'w, W: 'w + io::Write> {
27 wtr: &'w mut Writer<W>,
28}
29
30impl<'a, 'w, W: io::Write> Serializer for &'a mut SeRecord<'w, W> {
31 type Ok = ();
32 type Error = Error;
33 type SerializeSeq = Self;
34 type SerializeTuple = Self;
35 type SerializeTupleStruct = Self;
36 type SerializeTupleVariant = Self;
37 type SerializeMap = Self;
38 type SerializeStruct = Self;
39 type SerializeStructVariant = Self;
40
41 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
42 if v {
43 self.wtr.write_field("true")
44 } else {
45 self.wtr.write_field("false")
46 }
47 }
48
49 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
50 let mut buffer = itoa::Buffer::new();
51 self.wtr.write_field(buffer.format(v))
52 }
53
54 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
55 let mut buffer = itoa::Buffer::new();
56 self.wtr.write_field(buffer.format(v))
57 }
58
59 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
60 let mut buffer = itoa::Buffer::new();
61 self.wtr.write_field(buffer.format(v))
62 }
63
64 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
65 let mut buffer = itoa::Buffer::new();
66 self.wtr.write_field(buffer.format(v))
67 }
68
69 serde_if_integer128! {
70 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
71 self.collect_str(&v)
72 }
73 }
74
75 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
76 let mut buffer = itoa::Buffer::new();
77 self.wtr.write_field(buffer.format(v))
78 }
79
80 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
81 let mut buffer = itoa::Buffer::new();
82 self.wtr.write_field(buffer.format(v))
83 }
84
85 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
86 let mut buffer = itoa::Buffer::new();
87 self.wtr.write_field(buffer.format(v))
88 }
89
90 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
91 let mut buffer = itoa::Buffer::new();
92 self.wtr.write_field(buffer.format(v))
93 }
94
95 serde_if_integer128! {
96 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
97 self.collect_str(&v)
98 }
99 }
100
101 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
102 let mut buffer = ryu::Buffer::new();
103 self.wtr.write_field(buffer.format(v))
104 }
105
106 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
107 let mut buffer = ryu::Buffer::new();
108 self.wtr.write_field(buffer.format(v))
109 }
110
111 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
112 self.wtr.write_field(v.encode_utf8(&mut [0; 4]))
113 }
114
115 fn serialize_str(self, value: &str) -> Result<Self::Ok, Self::Error> {
116 self.wtr.write_field(value)
117 }
118
119 fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error> {
120 self.wtr.write_field(value)
121 }
122
123 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
124 self.wtr.write_field(&[])
125 }
126
127 fn serialize_some<T: ?Sized + Serialize>(
128 self,
129 value: &T,
130 ) -> Result<Self::Ok, Self::Error> {
131 value.serialize(self)
132 }
133
134 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
135 None::<()>.serialize(self)
136 }
137
138 fn serialize_unit_struct(
139 self,
140 name: &'static str,
141 ) -> Result<Self::Ok, Self::Error> {
142 self.wtr.write_field(name)
143 }
144
145 fn serialize_unit_variant(
146 self,
147 _name: &'static str,
148 _variant_index: u32,
149 variant: &'static str,
150 ) -> Result<Self::Ok, Self::Error> {
151 self.wtr.write_field(variant)
152 }
153
154 fn serialize_newtype_struct<T: ?Sized + Serialize>(
155 self,
156 _name: &'static str,
157 value: &T,
158 ) -> Result<Self::Ok, Self::Error> {
159 value.serialize(self)
160 }
161
162 fn serialize_newtype_variant<T: ?Sized + Serialize>(
163 self,
164 _name: &'static str,
165 _variant_index: u32,
166 _variant: &'static str,
167 value: &T,
168 ) -> Result<Self::Ok, Self::Error> {
169 value.serialize(self)
170 }
171
172 fn serialize_seq(
173 self,
174 _len: Option<usize>,
175 ) -> Result<Self::SerializeSeq, Self::Error> {
176 Ok(self)
177 }
178
179 fn serialize_tuple(
180 self,
181 _len: usize,
182 ) -> Result<Self::SerializeTuple, Self::Error> {
183 Ok(self)
184 }
185
186 fn serialize_tuple_struct(
187 self,
188 _name: &'static str,
189 _len: usize,
190 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
191 Ok(self)
192 }
193
194 fn serialize_tuple_variant(
195 self,
196 _name: &'static str,
197 _variant_index: u32,
198 _variant: &'static str,
199 _len: usize,
200 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
201 Err(Error::custom("serializing enum tuple variants is not supported"))
202 }
203
204 fn serialize_map(
205 self,
206 _len: Option<usize>,
207 ) -> Result<Self::SerializeMap, Self::Error> {
208 // The right behavior for serializing maps isn't clear.
209 Err(Error::custom(
210 "serializing maps is not supported, \
211 if you have a use case, please file an issue at \
212 https://github.com/BurntSushi/rust-csv",
213 ))
214 }
215
216 fn serialize_struct(
217 self,
218 _name: &'static str,
219 _len: usize,
220 ) -> Result<Self::SerializeStruct, Self::Error> {
221 Ok(self)
222 }
223
224 fn serialize_struct_variant(
225 self,
226 _name: &'static str,
227 _variant_index: u32,
228 _variant: &'static str,
229 _len: usize,
230 ) -> Result<Self::SerializeStructVariant, Self::Error> {
231 Err(Error::custom("serializing enum struct variants is not supported"))
232 }
233}
234
235impl<'a, 'w, W: io::Write> SerializeSeq for &'a mut SeRecord<'w, W> {
236 type Ok = ();
237 type Error = Error;
238
239 fn serialize_element<T: ?Sized + Serialize>(
240 &mut self,
241 value: &T,
242 ) -> Result<(), Self::Error> {
243 value.serialize(&mut **self)
244 }
245
246 fn end(self) -> Result<Self::Ok, Self::Error> {
247 Ok(())
248 }
249}
250
251impl<'a, 'w, W: io::Write> SerializeTuple for &'a mut SeRecord<'w, W> {
252 type Ok = ();
253 type Error = Error;
254
255 fn serialize_element<T: ?Sized + Serialize>(
256 &mut self,
257 value: &T,
258 ) -> Result<(), Self::Error> {
259 value.serialize(&mut **self)
260 }
261
262 fn end(self) -> Result<Self::Ok, Self::Error> {
263 Ok(())
264 }
265}
266
267impl<'a, 'w, W: io::Write> SerializeTupleStruct for &'a mut SeRecord<'w, W> {
268 type Ok = ();
269 type Error = Error;
270
271 fn serialize_field<T: ?Sized + Serialize>(
272 &mut self,
273 value: &T,
274 ) -> Result<(), Self::Error> {
275 value.serialize(&mut **self)
276 }
277
278 fn end(self) -> Result<Self::Ok, Self::Error> {
279 Ok(())
280 }
281}
282
283impl<'a, 'w, W: io::Write> SerializeTupleVariant for &'a mut SeRecord<'w, W> {
284 type Ok = ();
285 type Error = Error;
286
287 fn serialize_field<T: ?Sized + Serialize>(
288 &mut self,
289 _value: &T,
290 ) -> Result<(), Self::Error> {
291 unreachable!()
292 }
293
294 fn end(self) -> Result<Self::Ok, Self::Error> {
295 unreachable!()
296 }
297}
298
299impl<'a, 'w, W: io::Write> SerializeMap for &'a mut SeRecord<'w, W> {
300 type Ok = ();
301 type Error = Error;
302
303 fn serialize_key<T: ?Sized + Serialize>(
304 &mut self,
305 _key: &T,
306 ) -> Result<(), Self::Error> {
307 unreachable!()
308 }
309
310 fn serialize_value<T: ?Sized + Serialize>(
311 &mut self,
312 _value: &T,
313 ) -> Result<(), Self::Error> {
314 unreachable!()
315 }
316
317 fn end(self) -> Result<Self::Ok, Self::Error> {
318 unreachable!()
319 }
320}
321
322impl<'a, 'w, W: io::Write> SerializeStruct for &'a mut SeRecord<'w, W> {
323 type Ok = ();
324 type Error = Error;
325
326 fn serialize_field<T: ?Sized + Serialize>(
327 &mut self,
328 _key: &'static str,
329 value: &T,
330 ) -> Result<(), Self::Error> {
331 value.serialize(&mut **self)
332 }
333
334 fn end(self) -> Result<Self::Ok, Self::Error> {
335 Ok(())
336 }
337}
338
339impl<'a, 'w, W: io::Write> SerializeStructVariant for &'a mut SeRecord<'w, W> {
340 type Ok = ();
341 type Error = Error;
342
343 fn serialize_field<T: ?Sized + Serialize>(
344 &mut self,
345 _key: &'static str,
346 _value: &T,
347 ) -> Result<(), Self::Error> {
348 unreachable!()
349 }
350
351 fn end(self) -> Result<Self::Ok, Self::Error> {
352 unreachable!()
353 }
354}
355
356impl SerdeError for Error {
357 fn custom<T: fmt::Display>(msg: T) -> Error {
358 Error::new(ErrorKind::Serialize(msg.to_string()))
359 }
360}
361
362fn error_scalar_outside_struct<T: fmt::Display>(name: T) -> Error {
363 Error::custom(format!(
364 "cannot serialize {} scalar outside struct \
365 when writing headers from structs",
366 name
367 ))
368}
369
370fn error_container_inside_struct<T: fmt::Display>(name: T) -> Error {
371 Error::custom(format!(
372 "cannot serialize {} container inside struct \
373 when writing headers from structs",
374 name
375 ))
376}
377
378/// Write header names corresponding to the field names of the value (if the
379/// value has field names).
380///
381/// If the type to be serialized has field names (e.g. it's a struct), then
382/// header names are written, and the `Ok` return value is `true`.
383///
384/// If the type to be serialized doesn't have field names, then nothing is
385/// written, and the `Ok` return value is `false`.
386pub fn serialize_header<S: Serialize, W: io::Write>(
387 wtr: &mut Writer<W>,
388 value: S,
389) -> Result<bool, Error> {
390 let mut ser = SeHeader::new(wtr);
391 value.serialize(&mut ser).map(|_| ser.wrote_header())
392}
393
394/// State machine for `SeHeader`.
395///
396/// This is a diagram of the transitions in the state machine. Note that only
397/// some serialization events cause a state transition, and only for certain
398/// states. For example, encountering a scalar causes a transition if the state
399/// is `Write` or `EncounteredStructField`, but not if the state is
400/// `ErrorIfWrite(err)` or `InStructField`.
401///
402/// ```text
403/// +-----+
404/// |Write|
405/// +-----+
406/// |
407/// /------------------+------------------\
408/// | | |
409/// encounter finish encounter
410/// scalar | struct field
411/// | | |
412/// v v v
413/// +-----------------+ Ok(()) +-------------+
414/// |ErrorIfWrite(err)| |InStructField|<--------\
415/// +-----------------+ +-------------+ |
416/// | | |
417/// /------+------\ /-----------------+ |
418/// | | | | |
419/// encounter finish encounter finish encounter
420/// struct field | container field struct field
421/// | | | | |
422/// v v v v |
423/// Err(err) Ok(()) Err(_) +----------------------+ |
424/// |EncounteredStructField| |
425/// +----------------------+ |
426/// | |
427/// /----------+----------------/
428/// | |
429/// encounter finish
430/// scalar |
431/// | |
432/// v v
433/// Err(_) Ok(())
434/// ```
435enum HeaderState {
436 /// Start here. Headers need to be written if the type has field names.
437 Write,
438 /// The serializer still has not encountered a struct field. If one is
439 /// encountered (headers need to be written), return the enclosed error.
440 ErrorIfWrite(Error),
441 /// The serializer encountered one or more struct fields (and wrote their
442 /// names).
443 EncounteredStructField,
444 /// The serializer is currently in a struct field value.
445 InStructField,
446}
447
448struct SeHeader<'w, W: 'w + io::Write> {
449 wtr: &'w mut Writer<W>,
450 state: HeaderState,
451}
452
453impl<'w, W: io::Write> SeHeader<'w, W> {
454 fn new(wtr: &'w mut Writer<W>) -> Self {
455 SeHeader { wtr: wtr, state: HeaderState::Write }
456 }
457
458 fn wrote_header(&self) -> bool {
459 use self::HeaderState::*;
460 match self.state {
461 Write | ErrorIfWrite(_) => false,
462 EncounteredStructField | InStructField => true,
463 }
464 }
465
466 fn handle_scalar<T: fmt::Display>(
467 &mut self,
468 name: T,
469 ) -> Result<(), Error> {
470 use self::HeaderState::*;
471
472 match self.state {
473 Write => {
474 self.state = ErrorIfWrite(error_scalar_outside_struct(name));
475 Ok(())
476 }
477 ErrorIfWrite(_) | InStructField => Ok(()),
478 EncounteredStructField => Err(error_scalar_outside_struct(name)),
479 }
480 }
481
482 fn handle_container<T: fmt::Display>(
483 &mut self,
484 name: T,
485 ) -> Result<&mut Self, Error> {
486 if let HeaderState::InStructField = self.state {
487 Err(error_container_inside_struct(name))
488 } else {
489 Ok(self)
490 }
491 }
492}
493
494impl<'a, 'w, W: io::Write> Serializer for &'a mut SeHeader<'w, W> {
495 type Ok = ();
496 type Error = Error;
497 type SerializeSeq = Self;
498 type SerializeTuple = Self;
499 type SerializeTupleStruct = Self;
500 type SerializeTupleVariant = Self;
501 type SerializeMap = Self;
502 type SerializeStruct = Self;
503 type SerializeStructVariant = Self;
504
505 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
506 self.handle_scalar(v)
507 }
508
509 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
510 self.handle_scalar(v)
511 }
512
513 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
514 self.handle_scalar(v)
515 }
516
517 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
518 self.handle_scalar(v)
519 }
520
521 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
522 self.handle_scalar(v)
523 }
524
525 serde_if_integer128! {
526 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
527 self.handle_scalar(v)
528 }
529 }
530
531 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
532 self.handle_scalar(v)
533 }
534
535 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
536 self.handle_scalar(v)
537 }
538
539 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
540 self.handle_scalar(v)
541 }
542
543 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
544 self.handle_scalar(v)
545 }
546
547 serde_if_integer128! {
548 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
549 self.handle_scalar(v)
550 }
551 }
552
553 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
554 self.handle_scalar(v)
555 }
556
557 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
558 self.handle_scalar(v)
559 }
560
561 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
562 self.handle_scalar(v)
563 }
564
565 fn serialize_str(self, value: &str) -> Result<Self::Ok, Self::Error> {
566 self.handle_scalar(value)
567 }
568
569 fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, Self::Error> {
570 self.handle_scalar("&[u8]")
571 }
572
573 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
574 self.handle_scalar("None")
575 }
576
577 fn serialize_some<T: ?Sized + Serialize>(
578 self,
579 _value: &T,
580 ) -> Result<Self::Ok, Self::Error> {
581 self.handle_scalar("Some(_)")
582 }
583
584 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
585 self.handle_scalar("()")
586 }
587
588 fn serialize_unit_struct(
589 self,
590 name: &'static str,
591 ) -> Result<Self::Ok, Self::Error> {
592 self.handle_scalar(name)
593 }
594
595 fn serialize_unit_variant(
596 self,
597 name: &'static str,
598 _variant_index: u32,
599 variant: &'static str,
600 ) -> Result<Self::Ok, Self::Error> {
601 self.handle_scalar(format!("{}::{}", name, variant))
602 }
603
604 fn serialize_newtype_struct<T: ?Sized + Serialize>(
605 self,
606 name: &'static str,
607 _value: &T,
608 ) -> Result<Self::Ok, Self::Error> {
609 self.handle_scalar(format!("{}(_)", name))
610 }
611
612 fn serialize_newtype_variant<T: ?Sized + Serialize>(
613 self,
614 name: &'static str,
615 _variant_index: u32,
616 variant: &'static str,
617 _value: &T,
618 ) -> Result<Self::Ok, Self::Error> {
619 self.handle_scalar(format!("{}::{}(_)", name, variant))
620 }
621
622 fn serialize_seq(
623 self,
624 _len: Option<usize>,
625 ) -> Result<Self::SerializeSeq, Self::Error> {
626 self.handle_container("sequence")
627 }
628
629 fn serialize_tuple(
630 self,
631 _len: usize,
632 ) -> Result<Self::SerializeTuple, Self::Error> {
633 self.handle_container("tuple")
634 }
635
636 fn serialize_tuple_struct(
637 self,
638 name: &'static str,
639 _len: usize,
640 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
641 self.handle_container(name)
642 }
643
644 fn serialize_tuple_variant(
645 self,
646 _name: &'static str,
647 _variant_index: u32,
648 _variant: &'static str,
649 _len: usize,
650 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
651 Err(Error::custom("serializing enum tuple variants is not supported"))
652 }
653
654 fn serialize_map(
655 self,
656 _len: Option<usize>,
657 ) -> Result<Self::SerializeMap, Self::Error> {
658 // The right behavior for serializing maps isn't clear.
659 Err(Error::custom(
660 "serializing maps is not supported, \
661 if you have a use case, please file an issue at \
662 https://github.com/BurntSushi/rust-csv",
663 ))
664 }
665
666 fn serialize_struct(
667 self,
668 name: &'static str,
669 _len: usize,
670 ) -> Result<Self::SerializeStruct, Self::Error> {
671 self.handle_container(name)
672 }
673
674 fn serialize_struct_variant(
675 self,
676 _name: &'static str,
677 _variant_index: u32,
678 _variant: &'static str,
679 _len: usize,
680 ) -> Result<Self::SerializeStructVariant, Self::Error> {
681 Err(Error::custom("serializing enum struct variants is not supported"))
682 }
683}
684
685impl<'a, 'w, W: io::Write> SerializeSeq for &'a mut SeHeader<'w, W> {
686 type Ok = ();
687 type Error = Error;
688
689 fn serialize_element<T: ?Sized + Serialize>(
690 &mut self,
691 value: &T,
692 ) -> Result<(), Self::Error> {
693 value.serialize(&mut **self)
694 }
695
696 fn end(self) -> Result<Self::Ok, Self::Error> {
697 Ok(())
698 }
699}
700
701impl<'a, 'w, W: io::Write> SerializeTuple for &'a mut SeHeader<'w, W> {
702 type Ok = ();
703 type Error = Error;
704
705 fn serialize_element<T: ?Sized + Serialize>(
706 &mut self,
707 value: &T,
708 ) -> Result<(), Self::Error> {
709 value.serialize(&mut **self)
710 }
711
712 fn end(self) -> Result<Self::Ok, Self::Error> {
713 Ok(())
714 }
715}
716
717impl<'a, 'w, W: io::Write> SerializeTupleStruct for &'a mut SeHeader<'w, W> {
718 type Ok = ();
719 type Error = Error;
720
721 fn serialize_field<T: ?Sized + Serialize>(
722 &mut self,
723 value: &T,
724 ) -> Result<(), Self::Error> {
725 value.serialize(&mut **self)
726 }
727
728 fn end(self) -> Result<Self::Ok, Self::Error> {
729 Ok(())
730 }
731}
732
733impl<'a, 'w, W: io::Write> SerializeTupleVariant for &'a mut SeHeader<'w, W> {
734 type Ok = ();
735 type Error = Error;
736
737 fn serialize_field<T: ?Sized + Serialize>(
738 &mut self,
739 _value: &T,
740 ) -> Result<(), Self::Error> {
741 unreachable!()
742 }
743
744 fn end(self) -> Result<Self::Ok, Self::Error> {
745 unreachable!()
746 }
747}
748
749impl<'a, 'w, W: io::Write> SerializeMap for &'a mut SeHeader<'w, W> {
750 type Ok = ();
751 type Error = Error;
752
753 fn serialize_key<T: ?Sized + Serialize>(
754 &mut self,
755 _key: &T,
756 ) -> Result<(), Self::Error> {
757 unreachable!()
758 }
759
760 fn serialize_value<T: ?Sized + Serialize>(
761 &mut self,
762 _value: &T,
763 ) -> Result<(), Self::Error> {
764 unreachable!()
765 }
766
767 fn end(self) -> Result<Self::Ok, Self::Error> {
768 unreachable!()
769 }
770}
771
772impl<'a, 'w, W: io::Write> SerializeStruct for &'a mut SeHeader<'w, W> {
773 type Ok = ();
774 type Error = Error;
775
776 fn serialize_field<T: ?Sized + Serialize>(
777 &mut self,
778 key: &'static str,
779 value: &T,
780 ) -> Result<(), Self::Error> {
781 // Grab old state and update state to `EncounteredStructField`.
782 let old_state =
783 mem::replace(&mut self.state, HeaderState::EncounteredStructField);
784 if let HeaderState::ErrorIfWrite(err) = old_state {
785 return Err(err);
786 }
787 self.wtr.write_field(key)?;
788
789 // Check that there aren't any containers in the value.
790 self.state = HeaderState::InStructField;
791 value.serialize(&mut **self)?;
792 self.state = HeaderState::EncounteredStructField;
793
794 Ok(())
795 }
796
797 fn end(self) -> Result<Self::Ok, Self::Error> {
798 Ok(())
799 }
800}
801
802impl<'a, 'w, W: io::Write> SerializeStructVariant for &'a mut SeHeader<'w, W> {
803 type Ok = ();
804 type Error = Error;
805
806 fn serialize_field<T: ?Sized + Serialize>(
807 &mut self,
808 _key: &'static str,
809 _value: &T,
810 ) -> Result<(), Self::Error> {
811 unreachable!()
812 }
813
814 fn end(self) -> Result<Self::Ok, Self::Error> {
815 unreachable!()
816 }
817}
818
819#[cfg(test)]
820mod tests {
821 use bstr::ByteSlice;
822 use serde::{serde_if_integer128, Serialize};
823
824 use crate::error::{Error, ErrorKind};
825 use crate::writer::Writer;
826
827 use super::{SeHeader, SeRecord};
828
829 fn serialize<S: Serialize>(s: S) -> String {
830 let mut wtr = Writer::from_writer(vec![]);
831 s.serialize(&mut SeRecord { wtr: &mut wtr }).unwrap();
832 wtr.write_record(None::<&[u8]>).unwrap();
833 String::from_utf8(wtr.into_inner().unwrap()).unwrap()
834 }
835
836 /// Serialize using `SeHeader`. Returns whether a header was written and
837 /// the output of the writer.
838 fn serialize_header<S: Serialize>(s: S) -> (bool, String) {
839 let mut wtr = Writer::from_writer(vec![]);
840 let wrote = {
841 let mut ser = SeHeader::new(&mut wtr);
842 s.serialize(&mut ser).unwrap();
843 ser.wrote_header()
844 };
845 (wrote, String::from_utf8(wtr.into_inner().unwrap()).unwrap())
846 }
847
848 fn serialize_err<S: Serialize>(s: S) -> Error {
849 let mut wtr = Writer::from_writer(vec![]);
850 s.serialize(&mut SeRecord { wtr: &mut wtr }).unwrap_err()
851 }
852
853 fn serialize_header_err<S: Serialize>(s: S) -> Error {
854 let mut wtr = Writer::from_writer(vec![]);
855 s.serialize(&mut SeHeader::new(&mut wtr)).unwrap_err()
856 }
857
858 #[test]
859 fn bool() {
860 let got = serialize(true);
861 assert_eq!(got, "true\n");
862 let (wrote, got) = serialize_header(true);
863 assert!(!wrote);
864 assert_eq!(got, "");
865 }
866
867 #[test]
868 fn integer() {
869 let got = serialize(12345);
870 assert_eq!(got, "12345\n");
871 let (wrote, got) = serialize_header(12345);
872 assert!(!wrote);
873 assert_eq!(got, "");
874 }
875
876 serde_if_integer128! {
877 #[test]
878 fn integer_u128() {
879 let got = serialize(i128::max_value() as u128 + 1);
880 assert_eq!(got, "170141183460469231731687303715884105728\n");
881 let (wrote, got) = serialize_header(12345);
882 assert!(!wrote);
883 assert_eq!(got, "");
884 }
885
886 #[test]
887 fn integer_i128() {
888 let got = serialize(i128::max_value());
889 assert_eq!(got, "170141183460469231731687303715884105727\n");
890 let (wrote, got) = serialize_header(12345);
891 assert!(!wrote);
892 assert_eq!(got, "");
893 }
894 }
895
896 #[test]
897 fn float() {
898 let got = serialize(1.23);
899 assert_eq!(got, "1.23\n");
900 let (wrote, got) = serialize_header(1.23);
901 assert!(!wrote);
902 assert_eq!(got, "");
903 }
904
905 #[test]
906 fn float_nan() {
907 let got = serialize(::std::f64::NAN);
908 assert_eq!(got, "NaN\n");
909 let (wrote, got) = serialize_header(::std::f64::NAN);
910 assert!(!wrote);
911 assert_eq!(got, "");
912 }
913
914 #[test]
915 fn char() {
916 let got = serialize('☃');
917 assert_eq!(got, "☃\n");
918 let (wrote, got) = serialize_header('☃');
919 assert!(!wrote);
920 assert_eq!(got, "");
921 }
922
923 #[test]
924 fn str() {
925 let got = serialize("how\nare\n\"you\"?");
926 assert_eq!(got, "\"how\nare\n\"\"you\"\"?\"\n");
927 let (wrote, got) = serialize_header("how\nare\n\"you\"?");
928 assert!(!wrote);
929 assert_eq!(got, "");
930 }
931
932 #[test]
933 fn bytes() {
934 let got = serialize(b"how\nare\n\"you\"?".as_bstr());
935 assert_eq!(got, "\"how\nare\n\"\"you\"\"?\"\n");
936 let (wrote, got) = serialize_header(&b"how\nare\n\"you\"?"[..]);
937 assert!(!wrote);
938 assert_eq!(got, "");
939 }
940
941 #[test]
942 fn option() {
943 let got = serialize(None::<()>);
944 assert_eq!(got, "\"\"\n");
945 let (wrote, got) = serialize_header(None::<()>);
946 assert!(!wrote);
947 assert_eq!(got, "");
948
949 let got = serialize(Some(5));
950 assert_eq!(got, "5\n");
951 let (wrote, got) = serialize_header(Some(5));
952 assert!(!wrote);
953 assert_eq!(got, "");
954 }
955
956 #[test]
957 fn unit() {
958 let got = serialize(());
959 assert_eq!(got, "\"\"\n");
960 let (wrote, got) = serialize_header(());
961 assert!(!wrote);
962 assert_eq!(got, "");
963
964 let got = serialize((5, ()));
965 assert_eq!(got, "5,\n");
966 let (wrote, got) = serialize_header(());
967 assert!(!wrote);
968 assert_eq!(got, "");
969 }
970
971 #[test]
972 fn struct_unit() {
973 #[derive(Serialize)]
974 struct Foo;
975
976 let got = serialize(Foo);
977 assert_eq!(got, "Foo\n");
978 let (wrote, got) = serialize_header(Foo);
979 assert!(!wrote);
980 assert_eq!(got, "");
981 }
982
983 #[test]
984 fn struct_newtype() {
985 #[derive(Serialize)]
986 struct Foo(f64);
987
988 let got = serialize(Foo(1.5));
989 assert_eq!(got, "1.5\n");
990 let (wrote, got) = serialize_header(Foo(1.5));
991 assert!(!wrote);
992 assert_eq!(got, "");
993 }
994
995 #[test]
996 fn enum_units() {
997 #[derive(Serialize)]
998 enum Wat {
999 Foo,
1000 Bar,
1001 Baz,
1002 }
1003
1004 let got = serialize(Wat::Foo);
1005 assert_eq!(got, "Foo\n");
1006 let (wrote, got) = serialize_header(Wat::Foo);
1007 assert!(!wrote);
1008 assert_eq!(got, "");
1009
1010 let got = serialize(Wat::Bar);
1011 assert_eq!(got, "Bar\n");
1012 let (wrote, got) = serialize_header(Wat::Bar);
1013 assert!(!wrote);
1014 assert_eq!(got, "");
1015
1016 let got = serialize(Wat::Baz);
1017 assert_eq!(got, "Baz\n");
1018 let (wrote, got) = serialize_header(Wat::Baz);
1019 assert!(!wrote);
1020 assert_eq!(got, "");
1021 }
1022
1023 #[test]
1024 fn enum_newtypes() {
1025 #[derive(Serialize)]
1026 enum Wat {
1027 Foo(i32),
1028 Bar(f32),
1029 Baz(bool),
1030 }
1031
1032 let got = serialize(Wat::Foo(5));
1033 assert_eq!(got, "5\n");
1034 let (wrote, got) = serialize_header(Wat::Foo(5));
1035 assert!(!wrote);
1036 assert_eq!(got, "");
1037
1038 let got = serialize(Wat::Bar(1.5));
1039 assert_eq!(got, "1.5\n");
1040 let (wrote, got) = serialize_header(Wat::Bar(1.5));
1041 assert!(!wrote);
1042 assert_eq!(got, "");
1043
1044 let got = serialize(Wat::Baz(true));
1045 assert_eq!(got, "true\n");
1046 let (wrote, got) = serialize_header(Wat::Baz(true));
1047 assert!(!wrote);
1048 assert_eq!(got, "");
1049 }
1050
1051 #[test]
1052 fn seq() {
1053 let got = serialize(vec![1, 2, 3]);
1054 assert_eq!(got, "1,2,3\n");
1055 let (wrote, got) = serialize_header(vec![1, 2, 3]);
1056 assert!(!wrote);
1057 assert_eq!(got, "");
1058 }
1059
1060 #[test]
1061 fn tuple() {
1062 let row = (true, 1.5, "hi");
1063 let got = serialize(row.clone());
1064 assert_eq!(got, "true,1.5,hi\n");
1065 let (wrote, got) = serialize_header(row.clone());
1066 assert!(!wrote);
1067 assert_eq!(got, "");
1068
1069 let row = (true, 1.5, vec![1, 2, 3]);
1070 let got = serialize(row.clone());
1071 assert_eq!(got, "true,1.5,1,2,3\n");
1072 let (wrote, got) = serialize_header(row.clone());
1073 assert!(!wrote);
1074 assert_eq!(got, "");
1075 }
1076
1077 #[test]
1078 fn tuple_struct() {
1079 #[derive(Clone, Serialize)]
1080 struct Foo(bool, i32, String);
1081
1082 let row = Foo(false, 42, "hi".to_string());
1083 let got = serialize(row.clone());
1084 assert_eq!(got, "false,42,hi\n");
1085 let (wrote, got) = serialize_header(row.clone());
1086 assert!(!wrote);
1087 assert_eq!(got, "");
1088 }
1089
1090 #[test]
1091 fn tuple_variant() {
1092 #[derive(Clone, Serialize)]
1093 enum Foo {
1094 X(bool, i32, String),
1095 }
1096
1097 let row = Foo::X(false, 42, "hi".to_string());
1098 let err = serialize_err(row.clone());
1099 match *err.kind() {
1100 ErrorKind::Serialize(_) => {}
1101 ref x => panic!("expected ErrorKind::Serialize but got '{:?}'", x),
1102 }
1103 let err = serialize_header_err(row.clone());
1104 match *err.kind() {
1105 ErrorKind::Serialize(_) => {}
1106 ref x => panic!("expected ErrorKind::Serialize but got '{:?}'", x),
1107 }
1108 }
1109
1110 #[test]
1111 fn enum_struct_variant() {
1112 #[derive(Clone, Serialize)]
1113 enum Foo {
1114 X { a: bool, b: i32, c: String },
1115 }
1116
1117 let row = Foo::X { a: false, b: 1, c: "hi".into() };
1118 let err = serialize_err(row.clone());
1119 match *err.kind() {
1120 ErrorKind::Serialize(_) => {}
1121 ref x => panic!("expected ErrorKind::Serialize but got '{:?}'", x),
1122 }
1123 let err = serialize_header_err(row.clone());
1124 match *err.kind() {
1125 ErrorKind::Serialize(_) => {}
1126 ref x => panic!("expected ErrorKind::Serialize but got '{:?}'", x),
1127 }
1128 }
1129
1130 #[test]
1131 fn struct_no_headers() {
1132 #[derive(Serialize)]
1133 struct Foo {
1134 x: bool,
1135 y: i32,
1136 z: String,
1137 }
1138
1139 let got = serialize(Foo { x: true, y: 5, z: "hi".into() });
1140 assert_eq!(got, "true,5,hi\n");
1141 }
1142
1143 serde_if_integer128! {
1144 #[test]
1145 fn struct_no_headers_128() {
1146 #[derive(Serialize)]
1147 struct Foo {
1148 x: i128,
1149 y: u128,
1150 }
1151
1152 let got =
1153 serialize(Foo { x: i128::max_value(), y: u128::max_value() });
1154 assert_eq!(
1155 got,
1156 "170141183460469231731687303715884105727,\
1157 340282366920938463463374607431768211455\n"
1158 );
1159 }
1160 }
1161
1162 #[test]
1163 fn struct_headers() {
1164 #[derive(Clone, Serialize)]
1165 struct Foo {
1166 x: bool,
1167 y: i32,
1168 z: String,
1169 }
1170
1171 let row = Foo { x: true, y: 5, z: "hi".into() };
1172 let (wrote, got) = serialize_header(row.clone());
1173 assert!(wrote);
1174 assert_eq!(got, "x,y,z");
1175 let got = serialize(row.clone());
1176 assert_eq!(got, "true,5,hi\n");
1177 }
1178
1179 #[test]
1180 fn struct_headers_nested() {
1181 #[derive(Clone, Serialize)]
1182 struct Foo {
1183 label: String,
1184 nest: Nested,
1185 }
1186 #[derive(Clone, Serialize)]
1187 struct Nested {
1188 label2: String,
1189 value: i32,
1190 }
1191
1192 let row = Foo {
1193 label: "foo".into(),
1194 nest: Nested { label2: "bar".into(), value: 5 },
1195 };
1196
1197 let got = serialize(row.clone());
1198 assert_eq!(got, "foo,bar,5\n");
1199
1200 let err = serialize_header_err(row.clone());
1201 match *err.kind() {
1202 ErrorKind::Serialize(_) => {}
1203 ref x => panic!("expected ErrorKind::Serialize but got '{:?}'", x),
1204 }
1205 }
1206
1207 #[test]
1208 fn struct_headers_nested_seq() {
1209 #[derive(Clone, Serialize)]
1210 struct Foo {
1211 label: String,
1212 values: Vec<i32>,
1213 }
1214 let row = Foo { label: "foo".into(), values: vec![1, 2, 3] };
1215
1216 let got = serialize(row.clone());
1217 assert_eq!(got, "foo,1,2,3\n");
1218
1219 let err = serialize_header_err(row.clone());
1220 match *err.kind() {
1221 ErrorKind::Serialize(_) => {}
1222 ref x => panic!("expected ErrorKind::Serialize but got '{:?}'", x),
1223 }
1224 }
1225
1226 #[test]
1227 fn struct_headers_inside_tuple() {
1228 #[derive(Clone, Serialize)]
1229 struct Foo {
1230 label: String,
1231 num: f64,
1232 }
1233 #[derive(Clone, Serialize)]
1234 struct Bar {
1235 label2: bool,
1236 value: i32,
1237 empty: (),
1238 }
1239 let row = (
1240 Foo { label: "hi".to_string(), num: 5.0 },
1241 Bar { label2: true, value: 3, empty: () },
1242 Foo { label: "baz".to_string(), num: 2.3 },
1243 );
1244
1245 let got = serialize(row.clone());
1246 assert_eq!(got, "hi,5.0,true,3,,baz,2.3\n");
1247
1248 let (wrote, got) = serialize_header(row.clone());
1249 assert!(wrote);
1250 assert_eq!(got, "label,num,label2,value,empty,label,num");
1251 }
1252
1253 #[test]
1254 fn struct_headers_inside_tuple_scalar_before() {
1255 #[derive(Clone, Serialize)]
1256 struct Foo {
1257 label: String,
1258 num: f64,
1259 }
1260 let row = (3.14, Foo { label: "hi".to_string(), num: 5.0 });
1261
1262 let got = serialize(row.clone());
1263 assert_eq!(got, "3.14,hi,5.0\n");
1264
1265 let err = serialize_header_err(row.clone());
1266 match *err.kind() {
1267 ErrorKind::Serialize(_) => {}
1268 ref x => panic!("expected ErrorKind::Serialize but got '{:?}'", x),
1269 }
1270 }
1271
1272 #[test]
1273 fn struct_headers_inside_tuple_scalar_after() {
1274 #[derive(Clone, Serialize)]
1275 struct Foo {
1276 label: String,
1277 num: f64,
1278 }
1279 let row = (Foo { label: "hi".to_string(), num: 5.0 }, 3.14);
1280
1281 let got = serialize(row.clone());
1282 assert_eq!(got, "hi,5.0,3.14\n");
1283
1284 let err = serialize_header_err(row.clone());
1285 match *err.kind() {
1286 ErrorKind::Serialize(_) => {}
1287 ref x => panic!("expected ErrorKind::Serialize but got '{:?}'", x),
1288 }
1289 }
1290
1291 #[test]
1292 fn struct_headers_inside_seq() {
1293 #[derive(Clone, Serialize)]
1294 struct Foo {
1295 label: String,
1296 num: f64,
1297 }
1298 let row = vec![
1299 Foo { label: "hi".to_string(), num: 5.0 },
1300 Foo { label: "baz".to_string(), num: 2.3 },
1301 ];
1302
1303 let got = serialize(row.clone());
1304 assert_eq!(got, "hi,5.0,baz,2.3\n");
1305
1306 let (wrote, got) = serialize_header(row.clone());
1307 assert!(wrote);
1308 assert_eq!(got, "label,num,label,num");
1309 }
1310
1311 #[test]
1312 fn struct_headers_inside_nested_tuple_seq() {
1313 #[derive(Clone, Serialize)]
1314 struct Foo {
1315 label: String,
1316 num: f64,
1317 }
1318 #[derive(Clone, Serialize)]
1319 struct Bar {
1320 label2: Baz,
1321 value: i32,
1322 empty: (),
1323 }
1324 #[derive(Clone, Serialize)]
1325 struct Baz(bool);
1326 let row = (
1327 (
1328 Foo { label: "hi".to_string(), num: 5.0 },
1329 Bar { label2: Baz(true), value: 3, empty: () },
1330 ),
1331 vec![(Foo { label: "baz".to_string(), num: 2.3 },)],
1332 );
1333
1334 let got = serialize(row.clone());
1335 assert_eq!(got, "hi,5.0,true,3,,baz,2.3\n");
1336
1337 let (wrote, got) = serialize_header(row.clone());
1338 assert!(wrote);
1339 assert_eq!(got, "label,num,label2,value,empty,label,num");
1340 }
1341}