use std::io::Write;
use std::io::Result as Res;
use crate::{BigEndian, Endianness, LittleEndian, Serialize};
pub trait EWrite<E: Endianness>: Sized {
fn write <S: Serialize<E, Self>>(&mut self, ser: S) -> Res<()> { ser.serialize(self) }
fn write_be<S: Serialize<BigEndian, Self>>(&mut self, ser: S) -> Res<()> { ser.serialize(self) }
fn write_le<S: Serialize<LittleEndian, Self>>(&mut self, ser: S) -> Res<()> { ser.serialize(self) }
}
pub trait BEWrite: Sized {
fn write <S: Serialize<BigEndian, Self>>(&mut self, ser: S) -> Res<()> { ser.serialize(self) }
fn write_be<S: Serialize<BigEndian, Self>>(&mut self, ser: S) -> Res<()> { ser.serialize(self) }
fn write_le<S: Serialize<LittleEndian, Self>>(&mut self, ser: S) -> Res<()> { ser.serialize(self) }
}
pub trait LEWrite: Sized {
fn write <S: Serialize<LittleEndian, Self>>(&mut self, ser: S) -> Res<()> { ser.serialize(self) }
fn write_be<S: Serialize<BigEndian, Self>>(&mut self, ser: S) -> Res<()> { ser.serialize(self) }
fn write_le<S: Serialize<LittleEndian, Self>>(&mut self, ser: S) -> Res<()> { ser.serialize(self) }
}
impl<W: Write, E: Endianness> EWrite<E> for W {}
impl<W: Write> BEWrite for W {}
impl<W: Write> LEWrite for W {}
#[cfg(test)]
mod tests {
const DATA: &[u8] = b"\xba\xad";
#[test]
fn write_be_forced() {
use crate::LEWrite;
let mut writer = vec![];
writer.write_be(0xbaadu16).unwrap();
assert_eq!(writer, DATA);
}
#[test]
fn write_le_forced() {
use crate::BEWrite;
let mut writer = vec![];
writer.write_le(0xadbau16).unwrap();
assert_eq!(&writer[..], DATA);
}
}