|
33 | 33 | impl<'a, TData> ser::Serializer for &'a mut DataSerializer<TData> where TData : Serialize {
|
34 | 34 | type Ok = ();
|
35 | 35 | type Error = Error;
|
36 |
| - type SerializeSeq = (); |
37 |
| - type SerializeTuple = (); |
38 |
| - type SerializeTupleStruct = (); |
| 36 | + type SerializeSeq = Self; |
| 37 | + type SerializeTuple = Self; |
| 38 | + type SerializeTupleStruct = Self; |
39 | 39 | type SerializeTupleVariant = ();
|
40 | 40 | type SerializeMap = ();
|
41 | 41 | type SerializeStruct = ();
|
@@ -141,14 +141,20 @@ impl<'a, TData> ser::Serializer for &'a mut DataSerializer<TData> where TData :
|
141 | 141 | }
|
142 | 142 |
|
143 | 143 | fn serialize_none(self) -> Result<()> {
|
144 |
| - self.serialize_unit() |
| 144 | + self.marker(Marker::OptBegin)?; |
| 145 | + self.serialize_bool(false)?; // not present |
| 146 | + self.serialize_unit()?; |
| 147 | + self.marker(Marker::OptEnd) |
145 | 148 | }
|
146 | 149 |
|
147 | 150 | fn serialize_some<T>(self, value: &T) -> Result<()>
|
148 | 151 | where
|
149 | 152 | T: ?Sized + Serialize
|
150 | 153 | {
|
151 |
| - todo!() |
| 154 | + self.marker(Marker::OptBegin)?; |
| 155 | + self.serialize_bool(true)?; // present |
| 156 | + value.serialize(self)?; |
| 157 | + self.marker(Marker::OptEnd) |
152 | 158 | }
|
153 | 159 |
|
154 | 160 | fn serialize_unit(self) -> Result<()> {
|
@@ -177,37 +183,109 @@ impl<'a, TData> ser::Serializer for &'a mut DataSerializer<TData> where TData :
|
177 | 183 | todo!()
|
178 | 184 | }
|
179 | 185 |
|
180 |
| - fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { |
181 |
| - todo!() |
| 186 | + fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> { |
| 187 | + if let Some(length) = len { |
| 188 | + self.serialize_u64(length as u64)?; |
| 189 | + } |
| 190 | + |
| 191 | + self.marker(Marker::SeqBegin)?; |
| 192 | + Ok(self) |
182 | 193 | }
|
183 | 194 |
|
184 |
| - fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> { |
185 |
| - todo!() |
| 195 | + fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> { |
| 196 | + self.marker(Marker::TupleBegin)?; |
| 197 | + self.serialize_seq(Some(len)) |
186 | 198 | }
|
187 | 199 |
|
188 |
| - fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct, Self::Error> { |
189 |
| - todo!() |
| 200 | + fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct> { |
| 201 | + self.serialize_seq(Some(len)) |
190 | 202 | }
|
191 | 203 |
|
192 |
| - fn serialize_tuple_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant, Self::Error> { |
| 204 | + fn serialize_tuple_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant> { |
193 | 205 | todo!()
|
194 | 206 | }
|
195 | 207 |
|
196 |
| - fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { |
| 208 | + fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> { |
197 | 209 | todo!()
|
198 | 210 | }
|
199 | 211 |
|
200 |
| - fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct, Self::Error> { |
| 212 | + fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct> { |
201 | 213 | todo!()
|
202 | 214 | }
|
203 | 215 |
|
204 |
| - fn serialize_struct_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant, Self::Error> { |
| 216 | + fn serialize_struct_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant> { |
205 | 217 | todo!()
|
206 | 218 | }
|
207 | 219 | }
|
208 | 220 |
|
209 |
| -impl<'a, TData> ser::SerializeSeq for &'a mut DataSerializer<TData> |
| 221 | +impl<'a, TData> ser::SerializeSeq for &'a mut DataSerializer<TData> { |
| 222 | + type Ok = (); |
| 223 | + type Error = Error; |
| 224 | + |
| 225 | + fn serialize_element<T>(&mut self, value: &T) -> Result<()> |
| 226 | + where |
| 227 | + T: ?Sized + Serialize |
| 228 | + { |
| 229 | + let last_marker = Marker::try_from(&self.output[(self.output.len()-1)..][0])?; |
| 230 | + |
| 231 | + if last_marker != Marker::SeqBegin { |
| 232 | + self.marker(Marker::SeqBreak)?; |
| 233 | + } |
| 234 | + |
| 235 | + value.serialize(&mut **self) |
| 236 | + } |
| 237 | + |
| 238 | + fn end(self) -> Result<()> { |
| 239 | + self.marker(Marker::SeqEnd) |
| 240 | + } |
| 241 | +} |
| 242 | + |
| 243 | +impl<'a, TData : Serialize> ser::SerializeTuple for &'a mut DataSerializer<TData> { |
| 244 | + type Ok = (); |
| 245 | + type Error = Error; |
| 246 | + |
| 247 | + fn serialize_element<TElement>(&mut self, value: &TElement) -> Result<()> |
| 248 | + where |
| 249 | + TElement: ?Sized + Serialize, |
| 250 | + { |
| 251 | + let last_marker = Marker::try_from(&self.output[(self.output.len()-1)..][0])?; |
| 252 | + |
| 253 | + if last_marker != Marker::TupleBegin { |
| 254 | + self.marker(Marker::TupleBreak)?; |
| 255 | + } |
| 256 | + value.serialize(&mut **self) |
| 257 | + } |
| 258 | + |
| 259 | + fn end(self) -> Result<()> { |
| 260 | + self.marker(Marker::TupleEnd)?; |
| 261 | + Ok(()) |
| 262 | + } |
| 263 | +} |
| 264 | + |
| 265 | +impl<'a, TData : Serialize> ser::SerializeTupleStruct for &'a mut DataSerializer<TData> { |
| 266 | + type Ok = (); |
| 267 | + type Error = Error; |
| 268 | + |
| 269 | + fn serialize_field<T>(&mut self, value: &T) -> Result<()> |
| 270 | + where |
| 271 | + T: ?Sized + Serialize, |
| 272 | + { |
| 273 | + let last_marker = Marker::try_from(&self.output[(self.output.len()-1)..][0])?; |
| 274 | + |
| 275 | + if last_marker != Marker::TupleStructBegin { |
| 276 | + self.marker(Marker::TupleStructBreak)?; |
| 277 | + } |
| 278 | + value.serialize(&mut **self) |
| 279 | + } |
| 280 | + |
| 281 | + fn end(self) -> Result<()> { |
| 282 | + self.marker(Marker::TupleStructEnd)?; |
| 283 | + Ok(()) |
| 284 | + } |
| 285 | +} |
| 286 | + |
| 287 | + |
210 | 288 |
|
211 | 289 | trait SerializeData<TData> where TData: SerializeData<TData> {
|
212 |
| - fn serialize(serializer: DataSerializer<TData, dyn SerializeData<TData>>) -> io::Result<usize>; |
| 290 | + fn serialize(serializer: DataSerializer<TData>) -> io::Result<usize>; |
213 | 291 | }
|
0 commit comments