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