Coverage Report

Created: 2026-01-25 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/csv-1.4.0/src/serializer.rs
Line
Count
Source
1
use std::{fmt, io, mem};
2
3
use serde_core::ser::{
4
    Error as SerdeError, Serialize, SerializeMap, SerializeSeq,
5
    SerializeStruct, SerializeStructVariant, SerializeTuple,
6
    SerializeTupleStruct, SerializeTupleVariant, Serializer,
7
};
8
9
use crate::{
10
    error::{Error, ErrorKind},
11
    writer::Writer,
12
};
13
14
/// Serialize the given value to the given writer, and return an error if
15
/// anything went wrong.
16
0
pub fn serialize<S: Serialize, W: io::Write>(
17
0
    wtr: &mut Writer<W>,
18
0
    value: S,
19
0
) -> Result<(), Error> {
20
0
    value.serialize(&mut SeRecord { wtr })
21
0
}
22
23
struct SeRecord<'w, W: 'w + io::Write> {
24
    wtr: &'w mut Writer<W>,
25
}
26
27
impl<'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
0
    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
39
0
        if v {
40
0
            self.wtr.write_field("true")
41
        } else {
42
0
            self.wtr.write_field("false")
43
        }
44
0
    }
45
46
0
    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
47
0
        let mut buffer = itoa::Buffer::new();
48
0
        self.wtr.write_field(buffer.format(v))
49
0
    }
50
51
0
    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
52
0
        let mut buffer = itoa::Buffer::new();
53
0
        self.wtr.write_field(buffer.format(v))
54
0
    }
55
56
0
    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
57
0
        let mut buffer = itoa::Buffer::new();
58
0
        self.wtr.write_field(buffer.format(v))
59
0
    }
60
61
0
    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
62
0
        let mut buffer = itoa::Buffer::new();
63
0
        self.wtr.write_field(buffer.format(v))
64
0
    }
65
66
0
    fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
67
0
        let mut buffer = itoa::Buffer::new();
68
0
        self.wtr.write_field(buffer.format(v))
69
0
    }
70
71
0
    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
72
0
        let mut buffer = itoa::Buffer::new();
73
0
        self.wtr.write_field(buffer.format(v))
74
0
    }
75
76
0
    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
77
0
        let mut buffer = itoa::Buffer::new();
78
0
        self.wtr.write_field(buffer.format(v))
79
0
    }
80
81
0
    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
82
0
        let mut buffer = itoa::Buffer::new();
83
0
        self.wtr.write_field(buffer.format(v))
84
0
    }
85
86
0
    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
87
0
        let mut buffer = itoa::Buffer::new();
88
0
        self.wtr.write_field(buffer.format(v))
89
0
    }
90
91
0
    fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
92
0
        let mut buffer = itoa::Buffer::new();
93
0
        self.wtr.write_field(buffer.format(v))
94
0
    }
95
96
0
    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
97
0
        let mut buffer = ryu::Buffer::new();
98
0
        self.wtr.write_field(buffer.format(v))
99
0
    }
100
101
0
    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
102
0
        let mut buffer = ryu::Buffer::new();
103
0
        self.wtr.write_field(buffer.format(v))
104
0
    }
105
106
0
    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
107
0
        self.wtr.write_field(v.encode_utf8(&mut [0; 4]))
108
0
    }
109
110
0
    fn serialize_str(self, value: &str) -> Result<Self::Ok, Self::Error> {
111
0
        self.wtr.write_field(value)
112
0
    }
113
114
0
    fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error> {
115
0
        self.wtr.write_field(value)
116
0
    }
117
118
0
    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
119
0
        self.wtr.write_field([])
120
0
    }
121
122
0
    fn serialize_some<T: ?Sized + Serialize>(
123
0
        self,
124
0
        value: &T,
125
0
    ) -> Result<Self::Ok, Self::Error> {
126
0
        value.serialize(self)
127
0
    }
128
129
0
    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
130
0
        None::<()>.serialize(self)
131
0
    }
132
133
0
    fn serialize_unit_struct(
134
0
        self,
135
0
        name: &'static str,
136
0
    ) -> Result<Self::Ok, Self::Error> {
137
0
        self.wtr.write_field(name)
138
0
    }
139
140
0
    fn serialize_unit_variant(
141
0
        self,
142
0
        _name: &'static str,
143
0
        _variant_index: u32,
144
0
        variant: &'static str,
145
0
    ) -> Result<Self::Ok, Self::Error> {
146
0
        self.wtr.write_field(variant)
147
0
    }
148
149
0
    fn serialize_newtype_struct<T: ?Sized + Serialize>(
150
0
        self,
151
0
        _name: &'static str,
152
0
        value: &T,
153
0
    ) -> Result<Self::Ok, Self::Error> {
154
0
        value.serialize(self)
155
0
    }
156
157
0
    fn serialize_newtype_variant<T: ?Sized + Serialize>(
158
0
        self,
159
0
        _name: &'static str,
160
0
        _variant_index: u32,
161
0
        _variant: &'static str,
162
0
        value: &T,
163
0
    ) -> Result<Self::Ok, Self::Error> {
164
0
        value.serialize(self)
165
0
    }
166
167
0
    fn serialize_seq(
168
0
        self,
169
0
        _len: Option<usize>,
170
0
    ) -> Result<Self::SerializeSeq, Self::Error> {
171
0
        Ok(self)
172
0
    }
173
174
0
    fn serialize_tuple(
175
0
        self,
176
0
        _len: usize,
177
0
    ) -> Result<Self::SerializeTuple, Self::Error> {
178
0
        Ok(self)
179
0
    }
180
181
0
    fn serialize_tuple_struct(
182
0
        self,
183
0
        _name: &'static str,
184
0
        _len: usize,
185
0
    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
186
0
        Ok(self)
187
0
    }
188
189
0
    fn serialize_tuple_variant(
190
0
        self,
191
0
        _name: &'static str,
192
0
        _variant_index: u32,
193
0
        _variant: &'static str,
194
0
        _len: usize,
195
0
    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
196
0
        Err(Error::custom("serializing enum tuple variants is not supported"))
197
0
    }
198
199
0
    fn serialize_map(
200
0
        self,
201
0
        _len: Option<usize>,
202
0
    ) -> Result<Self::SerializeMap, Self::Error> {
203
        // The right behavior for serializing maps isn't clear.
204
0
        Err(Error::custom(
205
0
            "serializing maps is not supported, \
206
0
             if you have a use case, please file an issue at \
207
0
             https://github.com/BurntSushi/rust-csv",
208
0
        ))
209
0
    }
210
211
0
    fn serialize_struct(
212
0
        self,
213
0
        _name: &'static str,
214
0
        _len: usize,
215
0
    ) -> Result<Self::SerializeStruct, Self::Error> {
216
0
        Ok(self)
217
0
    }
218
219
0
    fn serialize_struct_variant(
220
0
        self,
221
0
        _name: &'static str,
222
0
        _variant_index: u32,
223
0
        _variant: &'static str,
224
0
        _len: usize,
225
0
    ) -> Result<Self::SerializeStructVariant, Self::Error> {
226
0
        Err(Error::custom("serializing enum struct variants is not supported"))
227
0
    }
228
}
229
230
impl<'a, 'w, W: io::Write> SerializeSeq for &'a mut SeRecord<'w, W> {
231
    type Ok = ();
232
    type Error = Error;
233
234
0
    fn serialize_element<T: ?Sized + Serialize>(
235
0
        &mut self,
236
0
        value: &T,
237
0
    ) -> Result<(), Self::Error> {
238
0
        value.serialize(&mut **self)
239
0
    }
240
241
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
242
0
        Ok(())
243
0
    }
244
}
245
246
impl<'a, 'w, W: io::Write> SerializeTuple for &'a mut SeRecord<'w, W> {
247
    type Ok = ();
248
    type Error = Error;
249
250
0
    fn serialize_element<T: ?Sized + Serialize>(
251
0
        &mut self,
252
0
        value: &T,
253
0
    ) -> Result<(), Self::Error> {
254
0
        value.serialize(&mut **self)
255
0
    }
256
257
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
258
0
        Ok(())
259
0
    }
260
}
261
262
impl<'a, 'w, W: io::Write> SerializeTupleStruct for &'a mut SeRecord<'w, W> {
263
    type Ok = ();
264
    type Error = Error;
265
266
0
    fn serialize_field<T: ?Sized + Serialize>(
267
0
        &mut self,
268
0
        value: &T,
269
0
    ) -> Result<(), Self::Error> {
270
0
        value.serialize(&mut **self)
271
0
    }
272
273
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
274
0
        Ok(())
275
0
    }
276
}
277
278
impl<'a, 'w, W: io::Write> SerializeTupleVariant for &'a mut SeRecord<'w, W> {
279
    type Ok = ();
280
    type Error = Error;
281
282
0
    fn serialize_field<T: ?Sized + Serialize>(
283
0
        &mut self,
284
0
        _value: &T,
285
0
    ) -> Result<(), Self::Error> {
286
0
        unreachable!()
287
    }
288
289
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
290
0
        unreachable!()
291
    }
292
}
293
294
impl<'a, 'w, W: io::Write> SerializeMap for &'a mut SeRecord<'w, W> {
295
    type Ok = ();
296
    type Error = Error;
297
298
0
    fn serialize_key<T: ?Sized + Serialize>(
299
0
        &mut self,
300
0
        _key: &T,
301
0
    ) -> Result<(), Self::Error> {
302
0
        unreachable!()
303
    }
304
305
0
    fn serialize_value<T: ?Sized + Serialize>(
306
0
        &mut self,
307
0
        _value: &T,
308
0
    ) -> Result<(), Self::Error> {
309
0
        unreachable!()
310
    }
311
312
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
313
0
        unreachable!()
314
    }
315
}
316
317
impl<'a, 'w, W: io::Write> SerializeStruct for &'a mut SeRecord<'w, W> {
318
    type Ok = ();
319
    type Error = Error;
320
321
0
    fn serialize_field<T: ?Sized + Serialize>(
322
0
        &mut self,
323
0
        _key: &'static str,
324
0
        value: &T,
325
0
    ) -> Result<(), Self::Error> {
326
0
        value.serialize(&mut **self)
327
0
    }
328
329
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
330
0
        Ok(())
331
0
    }
332
}
333
334
impl<'a, 'w, W: io::Write> SerializeStructVariant for &'a mut SeRecord<'w, W> {
335
    type Ok = ();
336
    type Error = Error;
337
338
0
    fn serialize_field<T: ?Sized + Serialize>(
339
0
        &mut self,
340
0
        _key: &'static str,
341
0
        _value: &T,
342
0
    ) -> Result<(), Self::Error> {
343
0
        unreachable!()
344
    }
345
346
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
347
0
        unreachable!()
348
    }
349
}
350
351
impl SerdeError for Error {
352
0
    fn custom<T: fmt::Display>(msg: T) -> Error {
353
0
        Error::new(ErrorKind::Serialize(msg.to_string()))
354
0
    }
355
}
356
357
0
fn error_scalar_outside_struct<T: fmt::Display>(name: T) -> Error {
358
0
    Error::custom(format!(
359
0
        "cannot serialize {} scalar outside struct \
360
0
         when writing headers from structs",
361
        name
362
    ))
363
0
}
364
365
0
fn error_container_inside_struct<T: fmt::Display>(name: T) -> Error {
366
0
    Error::custom(format!(
367
0
        "cannot serialize {} container inside struct \
368
0
         when writing headers from structs",
369
        name
370
    ))
371
0
}
372
373
/// Write header names corresponding to the field names of the value (if the
374
/// value has field names).
375
///
376
/// If the type to be serialized has field names (e.g. it's a struct), then
377
/// header names are written, and the `Ok` return value is `true`.
378
///
379
/// If the type to be serialized doesn't have field names, then nothing is
380
/// written, and the `Ok` return value is `false`.
381
0
pub fn serialize_header<S: Serialize, W: io::Write>(
382
0
    wtr: &mut Writer<W>,
383
0
    value: S,
384
0
) -> Result<bool, Error> {
385
0
    let mut ser = SeHeader::new(wtr);
386
0
    value.serialize(&mut ser).map(|_| ser.wrote_header())
387
0
}
388
389
/// State machine for `SeHeader`.
390
///
391
/// This is a diagram of the transitions in the state machine. Note that only
392
/// some serialization events cause a state transition, and only for certain
393
/// states. For example, encountering a scalar causes a transition if the state
394
/// is `Write` or `EncounteredStructField`, but not if the state is
395
/// `ErrorIfWrite(err)` or `InStructField`.
396
///
397
/// ```text
398
///                              +-----+
399
///                              |Write|
400
///                              +-----+
401
///                                 |
402
///              /------------------+------------------\
403
///              |                  |                  |
404
///          encounter            finish           encounter
405
///            scalar               |             struct field
406
///              |                  |                  |
407
///              v                  v                  v
408
///     +-----------------+       Ok(())        +-------------+
409
///     |ErrorIfWrite(err)|                     |InStructField|<--------\
410
///     +-----------------+                     +-------------+         |
411
///              |                                     |                |
412
///       /------+------\            /-----------------+                |
413
///       |             |            |                 |                |
414
///   encounter       finish     encounter          finish          encounter
415
///  struct field       |        container           field         struct field
416
///       |             |            |                 |                |
417
///       v             v            v                 v                |
418
///   Err(err)       Ok(())        Err(_)   +----------------------+    |
419
///                                         |EncounteredStructField|    |
420
///                                         +----------------------+    |
421
///                                                    |                |
422
///                                         /----------+----------------/
423
///                                         |          |
424
///                                     encounter    finish
425
///                                       scalar       |
426
///                                         |          |
427
///                                         v          v
428
///                                       Err(_)    Ok(())
429
/// ```
430
enum HeaderState {
431
    /// Start here. Headers need to be written if the type has field names.
432
    Write,
433
    /// The serializer still has not encountered a struct field. If one is
434
    /// encountered (headers need to be written), return the enclosed error.
435
    ErrorIfWrite(Error),
436
    /// The serializer encountered one or more struct fields (and wrote their
437
    /// names).
438
    EncounteredStructField,
439
    /// The serializer is currently in a struct field value.
440
    InStructField,
441
}
442
443
struct SeHeader<'w, W: 'w + io::Write> {
444
    wtr: &'w mut Writer<W>,
445
    state: HeaderState,
446
}
447
448
impl<'w, W: io::Write> SeHeader<'w, W> {
449
0
    fn new(wtr: &'w mut Writer<W>) -> Self {
450
0
        SeHeader { wtr, state: HeaderState::Write }
451
0
    }
452
453
0
    fn wrote_header(&self) -> bool {
454
        use self::HeaderState::*;
455
0
        match self.state {
456
0
            Write | ErrorIfWrite(_) => false,
457
0
            EncounteredStructField | InStructField => true,
458
        }
459
0
    }
460
461
0
    fn handle_scalar<T: fmt::Display>(
462
0
        &mut self,
463
0
        name: T,
464
0
    ) -> Result<(), Error> {
465
        use self::HeaderState::*;
466
467
0
        match self.state {
468
            Write => {
469
0
                self.state = ErrorIfWrite(error_scalar_outside_struct(name));
470
0
                Ok(())
471
            }
472
0
            ErrorIfWrite(_) | InStructField => Ok(()),
473
0
            EncounteredStructField => Err(error_scalar_outside_struct(name)),
474
        }
475
0
    }
476
477
0
    fn handle_container<T: fmt::Display>(
478
0
        &mut self,
479
0
        name: T,
480
0
    ) -> Result<&mut Self, Error> {
481
0
        if let HeaderState::InStructField = self.state {
482
0
            Err(error_container_inside_struct(name))
483
        } else {
484
0
            Ok(self)
485
        }
486
0
    }
487
}
488
489
impl<'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
0
    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
501
0
        self.handle_scalar(v)
502
0
    }
503
504
0
    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
505
0
        self.handle_scalar(v)
506
0
    }
507
508
0
    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
509
0
        self.handle_scalar(v)
510
0
    }
511
512
0
    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
513
0
        self.handle_scalar(v)
514
0
    }
515
516
0
    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
517
0
        self.handle_scalar(v)
518
0
    }
519
520
0
    fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
521
0
        self.handle_scalar(v)
522
0
    }
523
524
0
    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
525
0
        self.handle_scalar(v)
526
0
    }
527
528
0
    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
529
0
        self.handle_scalar(v)
530
0
    }
531
532
0
    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
533
0
        self.handle_scalar(v)
534
0
    }
535
536
0
    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
537
0
        self.handle_scalar(v)
538
0
    }
539
540
0
    fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
541
0
        self.handle_scalar(v)
542
0
    }
543
544
0
    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
545
0
        self.handle_scalar(v)
546
0
    }
547
548
0
    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
549
0
        self.handle_scalar(v)
550
0
    }
551
552
0
    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
553
0
        self.handle_scalar(v)
554
0
    }
555
556
0
    fn serialize_str(self, value: &str) -> Result<Self::Ok, Self::Error> {
557
0
        self.handle_scalar(value)
558
0
    }
559
560
0
    fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, Self::Error> {
561
0
        self.handle_scalar("&[u8]")
562
0
    }
563
564
0
    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
565
0
        self.handle_scalar("None")
566
0
    }
567
568
0
    fn serialize_some<T: ?Sized + Serialize>(
569
0
        self,
570
0
        _value: &T,
571
0
    ) -> Result<Self::Ok, Self::Error> {
572
0
        self.handle_scalar("Some(_)")
573
0
    }
574
575
0
    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
576
0
        self.handle_scalar("()")
577
0
    }
578
579
0
    fn serialize_unit_struct(
580
0
        self,
581
0
        name: &'static str,
582
0
    ) -> Result<Self::Ok, Self::Error> {
583
0
        self.handle_scalar(name)
584
0
    }
585
586
0
    fn serialize_unit_variant(
587
0
        self,
588
0
        name: &'static str,
589
0
        _variant_index: u32,
590
0
        variant: &'static str,
591
0
    ) -> Result<Self::Ok, Self::Error> {
592
0
        self.handle_scalar(format!("{}::{}", name, variant))
593
0
    }
594
595
0
    fn serialize_newtype_struct<T: ?Sized + Serialize>(
596
0
        self,
597
0
        name: &'static str,
598
0
        _value: &T,
599
0
    ) -> Result<Self::Ok, Self::Error> {
600
0
        self.handle_scalar(format!("{}(_)", name))
601
0
    }
602
603
0
    fn serialize_newtype_variant<T: ?Sized + Serialize>(
604
0
        self,
605
0
        name: &'static str,
606
0
        _variant_index: u32,
607
0
        variant: &'static str,
608
0
        _value: &T,
609
0
    ) -> Result<Self::Ok, Self::Error> {
610
0
        self.handle_scalar(format!("{}::{}(_)", name, variant))
611
0
    }
612
613
0
    fn serialize_seq(
614
0
        self,
615
0
        _len: Option<usize>,
616
0
    ) -> Result<Self::SerializeSeq, Self::Error> {
617
0
        self.handle_container("sequence")
618
0
    }
619
620
0
    fn serialize_tuple(
621
0
        self,
622
0
        _len: usize,
623
0
    ) -> Result<Self::SerializeTuple, Self::Error> {
624
0
        self.handle_container("tuple")
625
0
    }
626
627
0
    fn serialize_tuple_struct(
628
0
        self,
629
0
        name: &'static str,
630
0
        _len: usize,
631
0
    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
632
0
        self.handle_container(name)
633
0
    }
634
635
0
    fn serialize_tuple_variant(
636
0
        self,
637
0
        _name: &'static str,
638
0
        _variant_index: u32,
639
0
        _variant: &'static str,
640
0
        _len: usize,
641
0
    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
642
0
        Err(Error::custom("serializing enum tuple variants is not supported"))
643
0
    }
644
645
0
    fn serialize_map(
646
0
        self,
647
0
        _len: Option<usize>,
648
0
    ) -> Result<Self::SerializeMap, Self::Error> {
649
        // The right behavior for serializing maps isn't clear.
650
0
        Err(Error::custom(
651
0
            "serializing maps is not supported, \
652
0
             if you have a use case, please file an issue at \
653
0
             https://github.com/BurntSushi/rust-csv",
654
0
        ))
655
0
    }
656
657
0
    fn serialize_struct(
658
0
        self,
659
0
        name: &'static str,
660
0
        _len: usize,
661
0
    ) -> Result<Self::SerializeStruct, Self::Error> {
662
0
        self.handle_container(name)
663
0
    }
664
665
0
    fn serialize_struct_variant(
666
0
        self,
667
0
        _name: &'static str,
668
0
        _variant_index: u32,
669
0
        _variant: &'static str,
670
0
        _len: usize,
671
0
    ) -> Result<Self::SerializeStructVariant, Self::Error> {
672
0
        Err(Error::custom("serializing enum struct variants is not supported"))
673
0
    }
674
}
675
676
impl<'a, 'w, W: io::Write> SerializeSeq for &'a mut SeHeader<'w, W> {
677
    type Ok = ();
678
    type Error = Error;
679
680
0
    fn serialize_element<T: ?Sized + Serialize>(
681
0
        &mut self,
682
0
        value: &T,
683
0
    ) -> Result<(), Self::Error> {
684
0
        value.serialize(&mut **self)
685
0
    }
686
687
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
688
0
        Ok(())
689
0
    }
690
}
691
692
impl<'a, 'w, W: io::Write> SerializeTuple for &'a mut SeHeader<'w, W> {
693
    type Ok = ();
694
    type Error = Error;
695
696
0
    fn serialize_element<T: ?Sized + Serialize>(
697
0
        &mut self,
698
0
        value: &T,
699
0
    ) -> Result<(), Self::Error> {
700
0
        value.serialize(&mut **self)
701
0
    }
702
703
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
704
0
        Ok(())
705
0
    }
706
}
707
708
impl<'a, 'w, W: io::Write> SerializeTupleStruct for &'a mut SeHeader<'w, W> {
709
    type Ok = ();
710
    type Error = Error;
711
712
0
    fn serialize_field<T: ?Sized + Serialize>(
713
0
        &mut self,
714
0
        value: &T,
715
0
    ) -> Result<(), Self::Error> {
716
0
        value.serialize(&mut **self)
717
0
    }
718
719
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
720
0
        Ok(())
721
0
    }
722
}
723
724
impl<'a, 'w, W: io::Write> SerializeTupleVariant for &'a mut SeHeader<'w, W> {
725
    type Ok = ();
726
    type Error = Error;
727
728
0
    fn serialize_field<T: ?Sized + Serialize>(
729
0
        &mut self,
730
0
        _value: &T,
731
0
    ) -> Result<(), Self::Error> {
732
0
        unreachable!()
733
    }
734
735
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
736
0
        unreachable!()
737
    }
738
}
739
740
impl<'a, 'w, W: io::Write> SerializeMap for &'a mut SeHeader<'w, W> {
741
    type Ok = ();
742
    type Error = Error;
743
744
0
    fn serialize_key<T: ?Sized + Serialize>(
745
0
        &mut self,
746
0
        _key: &T,
747
0
    ) -> Result<(), Self::Error> {
748
0
        unreachable!()
749
    }
750
751
0
    fn serialize_value<T: ?Sized + Serialize>(
752
0
        &mut self,
753
0
        _value: &T,
754
0
    ) -> Result<(), Self::Error> {
755
0
        unreachable!()
756
    }
757
758
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
759
0
        unreachable!()
760
    }
761
}
762
763
impl<'a, 'w, W: io::Write> SerializeStruct for &'a mut SeHeader<'w, W> {
764
    type Ok = ();
765
    type Error = Error;
766
767
0
    fn serialize_field<T: ?Sized + Serialize>(
768
0
        &mut self,
769
0
        key: &'static str,
770
0
        value: &T,
771
0
    ) -> Result<(), Self::Error> {
772
        // Grab old state and update state to `EncounteredStructField`.
773
0
        let old_state =
774
0
            mem::replace(&mut self.state, HeaderState::EncounteredStructField);
775
0
        if let HeaderState::ErrorIfWrite(err) = old_state {
776
0
            return Err(err);
777
0
        }
778
0
        self.wtr.write_field(key)?;
779
780
        // Check that there aren't any containers in the value.
781
0
        self.state = HeaderState::InStructField;
782
0
        value.serialize(&mut **self)?;
783
0
        self.state = HeaderState::EncounteredStructField;
784
785
0
        Ok(())
786
0
    }
787
788
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
789
0
        Ok(())
790
0
    }
791
}
792
793
impl<'a, 'w, W: io::Write> SerializeStructVariant for &'a mut SeHeader<'w, W> {
794
    type Ok = ();
795
    type Error = Error;
796
797
0
    fn serialize_field<T: ?Sized + Serialize>(
798
0
        &mut self,
799
0
        _key: &'static str,
800
0
        _value: &T,
801
0
    ) -> Result<(), Self::Error> {
802
0
        unreachable!()
803
    }
804
805
0
    fn end(self) -> Result<Self::Ok, Self::Error> {
806
0
        unreachable!()
807
    }
808
}
809
810
#[cfg(test)]
811
mod 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
    /// Serialize using `SeHeader`. Returns whether a header was written and
829
    /// the output of the writer.
830
    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
}