diff options
Diffstat (limited to 'src/parser/mod.rs')
-rw-r--r-- | src/parser/mod.rs | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 88d0020..7ab2af4 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -43,37 +43,38 @@ //! Be warned! //! -use nom::Needed; +use nom::branch::alt; +use nom::combinator::{complete, map}; use nom::IResult; -mod timetype; -mod iterator; +use iterator::iterator; +use timetype::timetype; -use error::Result; -use error::Error; -use iter::Iter; -use timetype::IntoTimeType; -use parser::timetype::timetype; -use parser::iterator::iterator; +use crate::error::Error; +use crate::error::Result; +use crate::iter::Iter; +use crate::timetype::IntoTimeType; + +mod iterator; +mod timetype; pub enum Parsed { - Iterator(Result<::parser::iterator::UserIterator<Iter>>), - TimeType(::timetype::TimeType) + Iterator(Result<iterator::UserIterator<Iter>>), + TimeType(crate::timetype::TimeType), } -named!(do_parse<Result<Parsed>>, alt_complete!( - do_parse!(it: iterator >> (Ok(Parsed::Iterator(it.into_user_iterator())))) | - do_parse!(tt: timetype >> (tt.into_timetype().map(Parsed::TimeType))) -)); +fn do_parse(input: &[u8]) -> IResult<&[u8], Result<Parsed>> { + complete(alt(( + map(iterator, |it| Ok(Parsed::Iterator(it.into_user_iterator()))), + map(timetype, |tt| tt.into_timetype().map(Parsed::TimeType)), + )))(input) +} pub fn parse(s: &str) -> Result<Parsed> { match do_parse(s.as_bytes()) { - IResult::Done(_, Ok(o)) => Ok(o), - IResult::Done(_, Err(e)) => Err(e), - IResult::Error(e) => Err(e).map_err(From::from), - IResult::Incomplete(Needed::Unknown) => Err(Error::UnknownParserError), - IResult::Incomplete(Needed::Size(_)) => Err(Error::UnknownParserError), - + Ok((_, Ok(o))) => Ok(o), + Ok((_, Err(e))) => Err(e), + Err(nom::Err::Error(e) | nom::Err::Failure(e)) => Err(Error::NomError(e.code.description().to_string())), + Err(nom::Err::Incomplete(_)) => Err(Error::UnknownParserError), } } - |