mod impls;
use crate::{
io::{Seek, Write},
BinResult, Endian,
__private::Required,
};
pub trait BinWrite {
type Args<'a>;
#[inline]
fn write<W: Write + Seek>(&self, writer: &mut W) -> BinResult<()>
where
Self: crate::meta::WriteEndian,
for<'a> Self::Args<'a>: Required,
{
self.write_args(writer, Self::Args::args())
}
#[inline]
fn write_be<W: Write + Seek>(&self, writer: &mut W) -> BinResult<()>
where
for<'a> Self::Args<'a>: Required,
{
self.write_be_args(writer, Self::Args::args())
}
#[inline]
fn write_le<W: Write + Seek>(&self, writer: &mut W) -> BinResult<()>
where
for<'a> Self::Args<'a>: Required,
{
self.write_le_args(writer, Self::Args::args())
}
#[inline]
fn write_args<W: Write + Seek>(&self, writer: &mut W, args: Self::Args<'_>) -> BinResult<()>
where
Self: crate::meta::WriteEndian,
{
self.write_options(writer, Endian::Little, args)
}
#[inline]
fn write_be_args<W: Write + Seek>(
&self,
writer: &mut W,
args: Self::Args<'_>,
) -> BinResult<()> {
self.write_options(writer, Endian::Big, args)
}
#[inline]
fn write_le_args<W: Write + Seek>(
&self,
writer: &mut W,
args: Self::Args<'_>,
) -> BinResult<()> {
self.write_options(writer, Endian::Little, args)
}
fn write_options<W: Write + Seek>(
&self,
writer: &mut W,
endian: Endian,
args: Self::Args<'_>,
) -> BinResult<()>;
}
pub trait BinWriterExt: Write + Seek + Sized {
fn write_type<T: BinWrite>(&mut self, value: &T, endian: Endian) -> BinResult<()>
where
for<'a> T::Args<'a>: Required,
{
self.write_type_args(value, endian, T::Args::args())
}
fn write_be<T: BinWrite>(&mut self, value: &T) -> BinResult<()>
where
for<'a> T::Args<'a>: Required,
{
self.write_type(value, Endian::Big)
}
fn write_le<T: BinWrite>(&mut self, value: &T) -> BinResult<()>
where
for<'a> T::Args<'a>: Required,
{
self.write_type(value, Endian::Little)
}
fn write_ne<T: BinWrite>(&mut self, value: &T) -> BinResult<()>
where
for<'a> T::Args<'a>: Required,
{
self.write_type(value, Endian::NATIVE)
}
fn write_type_args<T: BinWrite>(
&mut self,
value: &T,
endian: Endian,
args: T::Args<'_>,
) -> BinResult<()> {
T::write_options(value, self, endian, args)?;
Ok(())
}
fn write_be_args<T: BinWrite>(&mut self, value: &T, args: T::Args<'_>) -> BinResult<()> {
self.write_type_args(value, Endian::Big, args)
}
fn write_le_args<T: BinWrite>(&mut self, value: &T, args: T::Args<'_>) -> BinResult<()> {
self.write_type_args(value, Endian::Little, args)
}
fn write_ne_args<T: BinWrite>(&mut self, value: &T, args: T::Args<'_>) -> BinResult<()> {
self.write_type_args(value, Endian::NATIVE, args)
}
}
impl<W: Write + Seek + Sized> BinWriterExt for W {}