use self::IResult::*;
#[cfg(feature = "core")]
use std::prelude::v1::*;
use std::boxed::Box;
#[derive(Debug,PartialEq,Eq,Clone)]
pub enum Err<'a>{
Code(u32),
Node(u32, Box<Err<'a>>),
Position(u32, &'a [u8]),
NodePosition(u32, &'a [u8], Box<Err<'a>>)
}
#[derive(Debug,PartialEq,Eq,Clone)]
pub enum Needed {
Unknown,
Size(usize)
}
#[derive(Debug,PartialEq,Eq,Clone)]
pub enum IResult<'a,I,O> {
Done(I,O),
Error(Err<'a>),
Incomplete(Needed)
}
impl<'a,I,O> IResult<'a,I,O> {
pub fn is_done(&self) -> bool {
match self {
&Done(_,_) => true,
_ => false
}
}
pub fn is_err(&self) -> bool {
match self {
&Error(_) => true,
_ => false
}
}
pub fn is_incomplete(&self) -> bool {
match self {
&Incomplete(_) => true,
_ => false
}
}
}
pub trait GetInput<I> {
fn remaining_input(&self) -> Option<I>;
}
pub trait GetOutput<O> {
fn output(&self) -> Option<O>;
}
impl<'a,I,O> GetInput<&'a[I]> for IResult<'a,&'a[I],O> {
fn remaining_input(&self) -> Option<&'a[I]> {
match self {
&Done(ref i,_) => Some(*i),
_ => None
}
}
}
impl<'a,O> GetInput<()> for IResult<'a,(),O> {
fn remaining_input(&self) -> Option<()> {
match self {
&Done((),_) => Some(()),
_ => None
}
}
}
impl<'a,I,O> GetOutput<&'a[O]> for IResult<'a,I,&'a[O]> {
fn output(&self) -> Option<&'a[O]> {
match self {
&Done(_, ref o) => Some(*o),
_ => None
}
}
}
impl<'a,I> GetOutput<()> for IResult<'a,I,()> {
fn output(&self) -> Option<()> {
match self {
&Done(_,()) => Some(()),
_ => None
}
}
}