use self::Needed::*;
use crate::error::ErrorKind;
pub type IResult<I, O, E=(I,ErrorKind)> = Result<(I, O), Err<E>>;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum Needed {
Unknown,
Size(usize),
}
impl Needed {
pub fn is_known(&self) -> bool {
*self != Unknown
}
#[inline]
pub fn map<F: Fn(usize) -> usize>(self, f: F) -> Needed {
match self {
Unknown => Unknown,
Size(n) => Size(f(n)),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum Err<E> {
Incomplete(Needed),
Error(E),
Failure(E),
}
impl<E> Err<E> {
pub fn is_incomplete(&self) -> bool {
if let Err::Incomplete(_) = self {
true
} else {
false
}
}
pub fn convert<F>(e: Err<F>) -> Self
where E: From<F> {
match e {
Err::Incomplete(n) => Err::Incomplete(n),
Err::Failure(c) => Err::Failure(c.into()),
Err::Error(c) => Err::Error(c.into()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::error::ErrorKind;
#[doc(hidden)]
#[macro_export]
macro_rules! assert_size (
($t:ty, $sz:expr) => (
assert_eq!(crate::lib::std::mem::size_of::<$t>(), $sz);
);
);
#[test]
#[cfg(target_pointer_width = "64")]
fn size_test() {
assert_size!(IResult<&[u8], &[u8], (&[u8], u32)>, 40);
assert_size!(IResult<&str, &str, u32>, 40);
assert_size!(Needed, 16);
assert_size!(Err<u32>, 24);
assert_size!(ErrorKind, 1);
}
}