rkyv/ser/serializers/
std.rs

1use crate::{ser::Serializer, Fallible};
2use std::io;
3
4/// Wraps a type that implements [`io::Write`](std::io::Write) and equips it with [`Serializer`].
5///
6/// # Examples
7/// ```
8/// use rkyv::ser::{serializers::WriteSerializer, Serializer};
9///
10/// let mut serializer = WriteSerializer::new(Vec::new());
11/// assert_eq!(serializer.pos(), 0);
12/// serializer.write(&[0u8, 1u8, 2u8, 3u8]);
13/// assert_eq!(serializer.pos(), 4);
14/// let buf = serializer.into_inner();
15/// assert_eq!(buf.len(), 4);
16/// assert_eq!(buf, vec![0u8, 1u8, 2u8, 3u8]);
17/// ```
18#[derive(Debug)]
19pub struct WriteSerializer<W: io::Write> {
20    inner: W,
21    pos: usize,
22}
23
24impl<W: io::Write> WriteSerializer<W> {
25    /// Creates a new serializer from a writer.
26    #[inline]
27    pub fn new(inner: W) -> Self {
28        Self::with_pos(inner, 0)
29    }
30
31    /// Creates a new serializer from a writer, and assumes that the underlying writer is currently
32    /// at the given position.
33    #[inline]
34    pub fn with_pos(inner: W, pos: usize) -> Self {
35        Self { inner, pos }
36    }
37
38    /// Consumes the serializer and returns the internal writer used to create it.
39    #[inline]
40    pub fn into_inner(self) -> W {
41        self.inner
42    }
43}
44
45impl<W: io::Write> Fallible for WriteSerializer<W> {
46    type Error = io::Error;
47}
48
49impl<W: io::Write> Serializer for WriteSerializer<W> {
50    #[inline]
51    fn pos(&self) -> usize {
52        self.pos
53    }
54
55    #[inline]
56    fn write(&mut self, bytes: &[u8]) -> Result<(), Self::Error> {
57        self.inner.write_all(bytes)?;
58        self.pos += bytes.len();
59        Ok(())
60    }
61}