#![no_std]
#![deny(missing_docs)]
#[cfg(feature = "use_std")]
extern crate std;
extern crate void;
#[cfg(feature = "use_std")]
pub mod std_impls;
pub mod error;
pub mod ext;
pub mod util;
pub mod bufio;
use void::Void;
use error::{ReadExactError, ExtendError};
use util::Chain;
pub trait Read {
type ReadError;
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::ReadError>;
fn read_exact(&mut self, mut buf: &mut [u8]) -> Result<(), ReadExactError<Self::ReadError>> {
if self.available_bytes(buf.len()) {
while !buf.is_empty() {
let read_bytes = self.read(buf)?;
if read_bytes == 0 {
return Err(ReadExactError::UnexpectedEnd);
}
let tmp = buf;
buf = &mut tmp[read_bytes..];
}
return Ok(());
} else {
Err(ReadExactError::UnexpectedEnd)
}
}
fn available_bytes(&self, _at_least: usize) -> bool {
true
}
fn chain<R: Read>(self, other: R) -> Chain<Self, R> where Self: Sized {
Chain::new(self, other)
}
fn read_to_end<T: ExtendFromReader>(&mut self, container: &mut T) -> Result<usize, ExtendError<Self::ReadError, T::ExtendError>> where Self: ReadOverwrite {
let mut total_bytes = 0;
loop {
let bytes = container.extend_from_reader(self)?;
if bytes == 0 {
return Ok(total_bytes)
}
total_bytes += bytes;
}
}
fn by_ref(&mut self) -> &mut Self where Self: Sized {
self
}
}
pub trait ExtendFromReaderSlow {
type ExtendError;
fn extend_from_reader_slow<R: Read + ?Sized>(&mut self, reader: &mut R) -> Result<usize, ExtendError<R::ReadError, Self::ExtendError>>;
}
pub trait ExtendFromReader: ExtendFromReaderSlow {
fn extend_from_reader<R: Read + ReadOverwrite + ?Sized>(&mut self, reader: &mut R) -> Result<usize, ExtendError<R::ReadError, Self::ExtendError>>;
}
pub unsafe trait ReadOverwrite: Read {}
pub trait Write {
type WriteError;
type FlushError;
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::WriteError>;
fn flush(&mut self) -> Result<(), Self::FlushError>;
fn write_all(&mut self, mut buf: &[u8]) -> Result<(), Self::WriteError> {
while !buf.is_empty() {
let len = self.write(buf)?;
buf = &buf[len..];
}
Ok(())
}
fn size_hint(&mut self, min: usize, max: Option<usize>) {
let _ = min;
let _ = max;
}
}
impl<'a, R: Read + ?Sized> Read for &'a mut R {
type ReadError = R::ReadError;
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::ReadError> {
(*self).read(buf)
}
}
impl<'a> Read for &'a [u8] {
type ReadError = Void;
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::ReadError> {
use ::core::cmp::min;
let amt = min(buf.len(), self.len());
let (a, b) = self.split_at(amt);
if amt == 1 {
buf[0] = a[0];
} else {
buf[..amt].copy_from_slice(a);
}
*self = b;
Ok(amt)
}
fn available_bytes(&self, at_least: usize) -> bool {
self.len() >= at_least
}
}