use super::fmt::Default;
use crate::{stream, unwrap, BufReadExt, ReadOneFrom, ReadOneFromError};
pub trait ReadOneInto<T> {
type Error: std::error::Error + From<stream::error::StreamError>;
fn try_read_one(&mut self) -> Result<T, Self::Error>;
fn try_read_in_char(&mut self) -> Result<T, Self::Error>;
fn try_read_in_line_trimmed(&mut self) -> Result<T, Self::Error>;
fn try_read_in_line_some_trimmed(&mut self) -> Result<T, Self::Error>;
fn try_read_all(&mut self) -> Result<Vec<T>, Self::Error>;
fn try_read_any_in_line(&mut self) -> Result<Vec<T>, Self::Error>;
fn try_read_some_in_line(&mut self) -> Result<Vec<T>, Self::Error>;
#[inline]
#[track_caller]
fn read_one(&mut self) -> T {
unwrap!(self.try_read_one())
}
#[inline]
#[track_caller]
fn read_in_char(&mut self) -> T {
unwrap!(self.try_read_in_char())
}
#[inline]
#[track_caller]
fn read_in_line_trimmed(&mut self) -> T {
unwrap!(self.try_read_in_line_trimmed())
}
#[inline]
#[track_caller]
fn read_in_line_some_trimmed(&mut self) -> T {
unwrap!(self.try_read_in_line_some_trimmed())
}
#[inline]
#[track_caller]
fn read_all(&mut self) -> Vec<T> {
unwrap!(self.try_read_all())
}
#[inline]
#[track_caller]
fn read_any_in_line(&mut self) -> Vec<T> {
unwrap!(self.try_read_any_in_line())
}
#[inline]
#[track_caller]
fn read_some_in_line(&mut self) -> Vec<T> {
unwrap!(self.try_read_some_in_line())
}
}
impl<T: ReadOneFrom, U: BufReadExt> ReadOneInto<T> for U {
type Error = ReadOneFromError<T>;
#[inline]
fn try_read_one(&mut self) -> Result<T, Self::Error> {
T::try_read_one_from(self, Default::new())
}
#[inline]
fn try_read_in_char(&mut self) -> Result<T, Self::Error> {
T::try_read_in_char_from(self, Default::new())
}
#[inline]
fn try_read_in_line_trimmed(&mut self) -> Result<T, Self::Error> {
T::try_read_in_line_trimmed_from(self, Default::new())
}
#[inline]
fn try_read_in_line_some_trimmed(&mut self) -> Result<T, Self::Error> {
T::try_read_in_line_some_trimmed_from(self, Default::new())
}
#[inline]
fn try_read_all(&mut self) -> Result<Vec<T>, Self::Error> {
T::try_read_all_from(self, Default::new())
}
#[inline]
fn try_read_any_in_line(&mut self) -> Result<Vec<T>, Self::Error> {
T::try_read_any_in_line_from(self, Default::new())
}
#[inline]
fn try_read_some_in_line(&mut self) -> Result<Vec<T>, Self::Error> {
T::try_read_some_in_line_from(self, Default::new())
}
}