use {
crate::io::{WriteResult, Writer},
std::io::{BufWriter, Write},
};
#[derive(Debug)]
pub struct WriteAdapter<W: ?Sized>(W);
impl<W: Write> WriteAdapter<W> {
pub fn new(writer: W) -> Self {
Self(writer)
}
}
impl<W: Write + ?Sized> Writer for WriteAdapter<W> {
fn write(&mut self, src: &[u8]) -> WriteResult<()> {
Ok(self.0.write_all(src)?)
}
fn finish(&mut self) -> WriteResult<()> {
Ok(self.0.flush()?)
}
}
impl<W: Write + ?Sized> Writer for BufWriter<W> {
fn write(&mut self, src: &[u8]) -> WriteResult<()> {
Ok(self.write_all(src)?)
}
fn finish(&mut self) -> WriteResult<()> {
Ok(self.flush()?)
}
}
#[cfg(test)]
mod tests {
use {
super::*,
crate::serde::{Serialize, serialize},
};
const MAGIC: u64 = 0xdeadbeef_cafebabe;
const DATA: &[(u32, bool, &u64)] = &[
(1u32, false, &MAGIC),
(2u32, true, &MAGIC),
(3u32, false, &MAGIC),
];
fn assert_serializes_data(mut writer: impl Writer) {
<[(u32, bool, &u64)]>::serialize_into(&mut writer, DATA).unwrap();
writer.finish().unwrap();
}
#[test]
fn write_adapter_serialize_tuples() {
let mut buf = Vec::new();
assert_serializes_data(WriteAdapter::new(&mut buf));
assert_eq!(buf, serialize(DATA).unwrap());
}
#[test]
fn buf_writer_serialize_tuples() {
let mut buf = Vec::new();
assert_serializes_data(BufWriter::new(&mut buf));
assert_eq!(buf, serialize(DATA).unwrap());
}
}