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