use std::io;
use rancor::{ResultExt as _, Source};
use crate::ser::{Positional, Writer};
#[derive(Debug)]
pub struct IoWriter<W> {
inner: W,
pos: usize,
}
impl<W> IoWriter<W> {
pub fn new(inner: W) -> Self {
Self::with_pos(inner, 0)
}
pub fn with_pos(inner: W, pos: usize) -> Self {
Self { inner, pos }
}
pub fn into_inner(self) -> W {
self.inner
}
}
impl<W> Positional for IoWriter<W> {
fn pos(&self) -> usize {
self.pos
}
}
impl<W: io::Write, E: Source> Writer<E> for IoWriter<W> {
fn write(&mut self, bytes: &[u8]) -> Result<(), E> {
self.inner.write_all(bytes).into_error()?;
self.pos += bytes.len();
Ok(())
}
}
#[cfg(test)]
mod tests {
use rancor::Failure;
use crate::{
api::serialize_using, ser::writer::IoWriter, util::Align, Archive,
Serialize,
};
#[test]
fn write_serializer() {
#[derive(Archive, Serialize)]
#[rkyv(crate, attr(repr(C)))]
struct Example {
x: i32,
}
let mut buf = Align([0u8; 3]);
let mut ser = IoWriter::new(&mut buf[..]);
let foo = Example { x: 100 };
serialize_using::<_, Failure>(&foo, &mut ser)
.expect_err("serialized to an undersized buffer must fail");
}
}