1use crate::varint::WriteVarInt;
36use serde;
37use serde::Serialize;
38use std::fmt::{Debug, Display, Formatter};
39use std::io::Write;
40
41pub struct RWSerializer<Dst: Write> {
45 destination: Dst,
46}
47
48impl<Dst: Write> RWSerializer<Dst> {
49 pub fn new(destination: Dst) -> Self {
51 Self { destination }
52 }
53
54 pub fn into_inner(self) -> Dst {
56 self.destination
57 }
58
59 pub fn as_dst_mut(&mut self) -> &mut Dst {
61 &mut self.destination
62 }
63
64 pub fn as_dst(&self) -> &Dst {
66 &self.destination
67 }
68
69 pub fn flush(&mut self) -> Result<(), std::io::Error> {
73 self.destination.flush()
74 }
75}
76
77#[derive(Debug)]
82pub enum SerializeError {
83 IO(std::io::Error),
84 SequenceWithoutLen,
85 FieldSkipped,
86 Custom(String),
87}
88
89impl Display for SerializeError {
90 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
91 match self {
92 Self::IO(err) => write!(f, "failed to write: {err}"),
93 Self::FieldSkipped => {
94 write!(f, "`skip_field` should be unreachable for `Serializer`")
95 }
96 Self::SequenceWithoutLen => {
97 write!(f, "the collection without known length was provided")
98 }
99 Self::Custom(msg) => write!(f, "{msg}"),
100 }
101 }
102}
103
104impl std::error::Error for SerializeError {}
105
106impl serde::ser::Error for SerializeError {
107 fn custom<T>(msg: T) -> Self
108 where
109 T: Display,
110 {
111 Self::Custom(msg.to_string())
112 }
113}
114
115impl<'s, Dst: Write> serde::Serializer for &'s mut RWSerializer<Dst> {
116 type Ok = usize;
117 type Error = SerializeError;
118 type SerializeSeq = SerializerWithAcc<'s, Dst>;
119 type SerializeTuple = SerializerWithAcc<'s, Dst>;
120 type SerializeTupleStruct = SerializerWithAcc<'s, Dst>;
121 type SerializeTupleVariant = SerializerWithAcc<'s, Dst>;
122 type SerializeMap = SerializerWithAcc<'s, Dst>;
123 type SerializeStruct = SerializerWithAcc<'s, Dst>;
124 type SerializeStructVariant = SerializerWithAcc<'s, Dst>;
125
126 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
127 self.destination
128 .write_all(&[u8::from(v)])
129 .map_err(SerializeError::IO)?;
130
131 Ok(1)
132 }
133
134 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
135 self.destination.write_varint(v).map_err(SerializeError::IO)
136 }
137
138 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
139 self.destination.write_varint(v).map_err(SerializeError::IO)
140 }
141
142 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
143 self.destination.write_varint(v).map_err(SerializeError::IO)
144 }
145
146 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
147 self.destination.write_varint(v).map_err(SerializeError::IO)
148 }
149
150 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
151 self.destination.write_varint(v).map_err(SerializeError::IO)
152 }
153
154 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
155 self.destination.write_varint(v).map_err(SerializeError::IO)
156 }
157
158 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
159 self.destination.write_varint(v).map_err(SerializeError::IO)
160 }
161
162 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
163 self.destination.write_varint(v).map_err(SerializeError::IO)
164 }
165
166 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
167 self.destination.write_varint(v).map_err(SerializeError::IO)
168 }
169
170 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
171 self.destination.write_varint(v).map_err(SerializeError::IO)
172 }
173
174 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
175 self.destination
176 .write_all(&v.to_le_bytes())
177 .map_err(SerializeError::IO)?;
178
179 Ok(size_of::<f32>())
180 }
181
182 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
183 self.destination
184 .write_all(&v.to_le_bytes())
185 .map_err(SerializeError::IO)?;
186
187 Ok(size_of::<f64>())
188 }
189
190 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
191 self.destination
192 .write_all(&(v as u32).to_le_bytes())
193 .map_err(SerializeError::IO)?;
194
195 Ok(size_of::<char>())
196 }
197
198 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
199 let written = self
200 .destination
201 .write_varint(v.len() as u64)
202 .map_err(SerializeError::IO)?;
203 self.destination
204 .write_all(v.as_bytes())
205 .map_err(SerializeError::IO)?;
206
207 Ok(written + v.len())
208 }
209
210 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
211 self.destination
212 .write_varint(v.len() as u64)
213 .map_err(SerializeError::IO)?;
214 self.destination.write_all(v).map_err(SerializeError::IO)?;
215
216 Ok(4 + v.len())
217 }
218
219 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
220 self.serialize_bool(false)
221 }
222
223 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
224 where
225 T: ?Sized + Serialize,
226 {
227 self.serialize_bool(true)?;
228
229 Ok(1 + value.serialize(self)?)
230 }
231
232 #[inline]
233 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
234 Ok(0)
235 }
236
237 #[inline]
238 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
239 Ok(0)
240 }
241
242 fn serialize_unit_variant(
243 self,
244 _name: &'static str,
245 variant_index: u32,
246 _variant: &'static str,
247 ) -> Result<Self::Ok, Self::Error> {
248 self.serialize_u32(variant_index)
249 }
250
251 fn serialize_newtype_struct<T>(
252 self,
253 _name: &'static str,
254 value: &T,
255 ) -> Result<Self::Ok, Self::Error>
256 where
257 T: ?Sized + Serialize,
258 {
259 value.serialize(self)
260 }
261
262 fn serialize_newtype_variant<T>(
263 self,
264 _name: &'static str,
265 variant_index: u32,
266 _variant: &'static str,
267 value: &T,
268 ) -> Result<Self::Ok, Self::Error>
269 where
270 T: ?Sized + Serialize,
271 {
272 Ok(self.serialize_u32(variant_index)? + value.serialize(self)?)
273 }
274
275 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
276 if let Some(len) = len {
277 Ok(SerializerWithAcc {
278 written: self
279 .destination
280 .write_varint(len as u64)
281 .map_err(SerializeError::IO)?,
282 serializer: self,
283 })
284 } else {
285 Err(SerializeError::SequenceWithoutLen)
286 }
287 }
288
289 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
290 Ok(SerializerWithAcc {
291 written: 0,
292 serializer: self,
293 })
294 }
295
296 fn serialize_tuple_struct(
297 self,
298 _name: &'static str,
299 _len: usize,
300 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
301 Ok(SerializerWithAcc {
302 written: 0,
303 serializer: self,
304 })
305 }
306
307 fn serialize_tuple_variant(
308 self,
309 _name: &'static str,
310 variant_index: u32,
311 _variant: &'static str,
312 _len: usize,
313 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
314 let written = self
315 .destination
316 .write_varint(variant_index)
317 .map_err(SerializeError::IO)?;
318
319 Ok(SerializerWithAcc {
320 written,
321 serializer: self,
322 })
323 }
324
325 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
326 if let Some(len) = len {
327 Ok(SerializerWithAcc {
328 written: self
329 .destination
330 .write_varint(len as u64)
331 .map_err(SerializeError::IO)?,
332 serializer: self,
333 })
334 } else {
335 Err(SerializeError::SequenceWithoutLen)
336 }
337 }
338
339 fn serialize_struct(
340 self,
341 _name: &'static str,
342 _len: usize,
343 ) -> Result<Self::SerializeStruct, Self::Error> {
344 Ok(SerializerWithAcc {
345 written: 0,
346 serializer: self,
347 })
348 }
349
350 fn serialize_struct_variant(
351 self,
352 _name: &'static str,
353 variant_index: u32,
354 _variant: &'static str,
355 _len: usize,
356 ) -> Result<Self::SerializeStructVariant, Self::Error> {
357 let written = self
358 .destination
359 .write_varint(variant_index)
360 .map_err(SerializeError::IO)?;
361
362 Ok(SerializerWithAcc {
363 written,
364 serializer: self,
365 })
366 }
367
368 fn is_human_readable(&self) -> bool {
369 false
370 }
371}
372
373pub struct SerializerWithAcc<'s, Dst: Write> {
374 serializer: &'s mut RWSerializer<Dst>,
375 written: usize,
376}
377
378impl<Dst: Write> serde::ser::SerializeSeq for SerializerWithAcc<'_, Dst> {
379 type Ok = usize;
380 type Error = SerializeError;
381
382 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
383 where
384 T: ?Sized + Serialize,
385 {
386 self.written += value.serialize(&mut *self.serializer)?;
387
388 Ok(())
389 }
390
391 fn end(self) -> Result<Self::Ok, Self::Error> {
392 Ok(self.written)
393 }
394}
395
396impl<Dst: Write> serde::ser::SerializeTuple for SerializerWithAcc<'_, Dst> {
397 type Ok = usize;
398 type Error = SerializeError;
399
400 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
401 where
402 T: ?Sized + Serialize,
403 {
404 self.written += value.serialize(&mut *self.serializer)?;
405
406 Ok(())
407 }
408
409 fn end(self) -> Result<Self::Ok, Self::Error> {
410 Ok(self.written)
411 }
412}
413
414impl<Dst: Write> serde::ser::SerializeTupleStruct for SerializerWithAcc<'_, Dst> {
415 type Ok = usize;
416 type Error = SerializeError;
417
418 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
419 where
420 T: ?Sized + Serialize,
421 {
422 self.written += value.serialize(&mut *self.serializer)?;
423
424 Ok(())
425 }
426
427 fn end(self) -> Result<Self::Ok, Self::Error> {
428 Ok(self.written)
429 }
430}
431
432impl<Dst: Write> serde::ser::SerializeTupleVariant for SerializerWithAcc<'_, Dst> {
433 type Ok = usize;
434 type Error = SerializeError;
435
436 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
437 where
438 T: ?Sized + Serialize,
439 {
440 self.written += value.serialize(&mut *self.serializer)?;
441
442 Ok(())
443 }
444
445 fn end(self) -> Result<Self::Ok, Self::Error> {
446 Ok(self.written)
447 }
448}
449
450impl<Dst: Write> serde::ser::SerializeMap for SerializerWithAcc<'_, Dst> {
451 type Ok = usize;
452 type Error = SerializeError;
453
454 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
455 where
456 T: ?Sized + Serialize,
457 {
458 self.written += key.serialize(&mut *self.serializer)?;
459
460 Ok(())
461 }
462
463 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
464 where
465 T: ?Sized + Serialize,
466 {
467 self.written += value.serialize(&mut *self.serializer)?;
468
469 Ok(())
470 }
471
472 fn end(self) -> Result<Self::Ok, Self::Error> {
473 Ok(self.written)
474 }
475}
476
477impl<Dst: Write> serde::ser::SerializeStruct for SerializerWithAcc<'_, Dst> {
478 type Ok = usize;
479 type Error = SerializeError;
480
481 fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<(), Self::Error>
482 where
483 T: ?Sized + Serialize,
484 {
485 self.written += value.serialize(&mut *self.serializer)?;
486
487 Ok(())
488 }
489
490 fn skip_field(&mut self, _key: &'static str) -> Result<(), Self::Error> {
491 Err(SerializeError::FieldSkipped)
492 }
493
494 fn end(self) -> Result<Self::Ok, Self::Error> {
495 Ok(self.written)
496 }
497}
498
499impl<Dst: Write> serde::ser::SerializeStructVariant for SerializerWithAcc<'_, Dst> {
500 type Ok = usize;
501 type Error = SerializeError;
502
503 fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<(), Self::Error>
504 where
505 T: ?Sized + Serialize,
506 {
507 self.written += value.serialize(&mut *self.serializer)?;
508
509 Ok(())
510 }
511
512 fn skip_field(&mut self, _key: &'static str) -> Result<(), Self::Error> {
513 Err(SerializeError::FieldSkipped)
514 }
515
516 fn end(self) -> Result<Self::Ok, Self::Error> {
517 Ok(self.written)
518 }
519}