1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
use crateError;
use crate;
/// The result of [`StreamSerializer::drive_partial`].
/// A [`Serializer`] that writes bytes which can be taken while values are
/// serialized.
///
/// This is implemented by the serializers of the data formats (for
/// instance `deser_json::Serializer`). They hold the state of a stream of
/// values (for instance how many values were written, or the names of the
/// columns of a CSV file) and write everything that separates the values
/// of a stream, like the line breaks of JSON Lines or the markers between
/// YAML documents.
///
/// The bytes serialized so far are in [`output`](Self::output), whoever
/// writes them to a stream clears them with
/// [`clear_output`](Self::clear_output) afterwards. This makes stream
/// serializers usable without IO (sans-io): the writers of `deser::io`
/// and of other IO adapters (like `deser-tokio`) only move the output to
/// their stream.
///
/// ```
/// use deser::ser::{SerializeDriver, Serializer, StreamSerializer};
/// use deser::{Atom, Error, Event};
///
/// /// A format with a number per line.
/// #[derive(Default)]
/// struct Lines(Vec<u8>);
///
/// impl Serializer for Lines {
/// fn drive(&mut self, driver: &mut SerializeDriver<'_>) -> Result<(), Error> {
/// driver.drive(|event, _| {
/// if let Event::Atom(Atom::U64(value)) = event {
/// self.0.extend_from_slice(format!("{value}\n").as_bytes());
/// }
/// Ok(())
/// })
/// }
/// }
///
/// impl StreamSerializer for Lines {
/// fn output(&self) -> &[u8] {
/// &self.0
/// }
///
/// fn clear_output(&mut self) {
/// self.0.clear();
/// }
/// }
///
/// let mut lines = Lines::default();
/// lines.serialize(&1u64).unwrap();
/// lines.serialize(&2u64).unwrap();
/// // the output would be written to a stream here
/// assert_eq!(lines.output(), b"1\n2\n");
/// lines.clear_output();
/// ```
///
/// # Serializing in Parts
///
/// Formats which can write the output of a value before the value is
/// complete additionally implement [`drive_partial`](Self::drive_partial).
/// Writers use it to write large values in parts, so the memory used does
/// not depend on the size of the values. While a value is written in
/// parts, [`in_progress`](Self::in_progress) is `true`.