use oct::serdes::Result;
#[cfg(feature = "std")]
use std::io;
#[cfg(not(feature = "std"))]
use core::mem::take;
#[cfg(not(feature = "std"))]
use oct::serdes::Error;
#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::vec::Vec;
#[cfg_attr(not(feature = "std"), doc = "[`std::io::Write`]: <https://doc.rust-lang.org/nightly/std/io/trait.Write.html>")]
pub trait Write {
#[cfg_attr(not(feature = "std"), doc = "[`std::io::Write::write`]: <https://doc.rust-lang.org/nightly/std/io/trait.Write.html#tymethod.write>")]
fn write(&mut self, buf: &[u8]) -> Result<usize>;
#[cfg_attr(not(feature = "std"), doc = "[`std::io::Write::write_all`]: <https://doc.rust-lang.org/nightly/std/io/trait.Write.html#tymethod.write_all>")]
fn write_all(&mut self, buf: &[u8]) -> Result<()>;
}
#[cfg(feature = "std")]
impl<T: ?Sized + io::Write> Write for T {
#[inline]
fn write(&mut self, buf: &[u8]) -> Result<usize> {
io::Write::write(self, buf).map_err(Into::into)
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> Result<()> {
io::Write::write_all(self, buf).map_err(Into::into)
}
}
#[cfg(not(feature = "std"))]
impl<T: ?Sized + Write> Write for &mut T {
#[inline]
fn write(&mut self, buf: &[u8]) -> Result<usize> {
T::write(*self, buf)
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> Result<()> {
T::write_all(*self, buf)
}
}
#[cfg(not(feature = "std"))]
impl Write for &mut [u8] {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
let count = buf.len().min(self.len());
let (slot, remaining) = take(self).split_at_mut(count);
slot.copy_from_slice(buf);
*self = remaining;
Ok(count)
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> Result<()> {
if self.write(buf)? == buf.len() {
Ok(())
} else {
Err(Error::write_zero())
}
}
}
#[cfg(all(feature = "alloc", not(feature = "std")))]
impl Write for Vec<u8> {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
self.extend_from_slice(buf);
Ok(buf.len())
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> Result<()> {
self.write(buf)?;
Ok(())
}
}