Trait combine::ParserExt
[−]
[src]
pub trait ParserExt: Parser + Sized { fn with<P2>(self, p: P2) -> With<Self, P2> where P2: Parser<Input=Self::Input> { ... } fn skip<P2>(self, p: P2) -> Skip<Self, P2> where P2: Parser<Input=Self::Input> { ... } fn and<P2>(self, p: P2) -> And<Self, P2> where P2: Parser<Input=Self::Input> { ... } fn or<P2>(self, p: P2) -> Or<Self, P2> where P2: Parser<Input=Self::Input> { ... } fn then<N, F>(self, f: F) -> Then<Self, F> where F: FnMut(Self::Output) -> N, N: Parser<Input=Self::Input> { ... } fn map<F, B>(self, f: F) -> Map<Self, F> where F: FnMut(Self::Output) -> B { ... } fn message<S>(self, msg: S) -> Message<Self> where S: Into<Info<Self::Input::Item, Self::Input::Range>> { ... } fn expected<S>(self, msg: S) -> Expected<Self> where S: Into<Info<Self::Input::Item, Self::Input::Range>> { ... } fn and_then<F, O, E>(self, f: F) -> AndThen<Self, F> where F: FnMut(Self::Output) -> Result<O, E>, E: Into<Error<Self::Input::Item, Self::Input::Range>> { ... } fn iter(self, input: State<Self::Input>) -> Iter<Self> { ... } }
Extension trait which provides functions that are more conveniently used through method calls
Provided Methods
fn with<P2>(self, p: P2) -> With<Self, P2> where P2: Parser<Input=Self::Input>
Discards the value of the self
parser and returns the value of p
Fails if any of the parsers fails
let result = digit() .with(token('i')) .parse("9i") .map(|x| x.0); assert_eq!(result, Ok('i'));
fn skip<P2>(self, p: P2) -> Skip<Self, P2> where P2: Parser<Input=Self::Input>
Discards the value of the p
parser and returns the value of self
Fails if any of the parsers fails
let result = digit() .skip(token('i')) .parse("9i") .map(|x| x.0); assert_eq!(result, Ok('9'));
fn and<P2>(self, p: P2) -> And<Self, P2> where P2: Parser<Input=Self::Input>
Parses with self
followed by p
Succeeds if both parsers succeed, otherwise fails
Returns a tuple with both values on success
let result = digit() .and(token('i')) .parse("9i") .map(|x| x.0); assert_eq!(result, Ok(('9', 'i')));
fn or<P2>(self, p: P2) -> Or<Self, P2> where P2: Parser<Input=Self::Input>
Returns a parser which attempts to parse using self
. If self
fails without consuming any
input it tries to consume the same input using p
.
let mut parser = string("let") .or(digit().map(|_| "digit")) .or(string("led")); assert_eq!(parser.parse("let"), Ok(("let", ""))); assert_eq!(parser.parse("1"), Ok(("digit", ""))); assert!(parser.parse("led").is_err()); let mut parser2 = string("two").or(string("three")); // Fails as the parser for "two" consumes the first 't' before failing assert!(parser2.parse("three").is_err()); // Use 'try' to make failing parsers always act as if they have not consumed any input let mut parser3 = try(string("two")).or(try(string("three"))); assert_eq!(parser3.parse("three"), Ok(("three", "")));
fn then<N, F>(self, f: F) -> Then<Self, F> where F: FnMut(Self::Output) -> N, N: Parser<Input=Self::Input>
Parses using self
and then passes the value to f
which returns a parser used to parse
the rest of the input
let result = digit() .then(|d| parser(move |input| { if d == '9' { Ok((9, Consumed::Empty(input))) } else { let err = ParseError::new(input.position, Error::Message("Not a nine".into())); Err((Consumed::Empty(err))) } })) .parse("9"); assert_eq!(result, Ok((9, "")));
fn map<F, B>(self, f: F) -> Map<Self, F> where F: FnMut(Self::Output) -> B
Uses f
to map over the parsed value
let result = digit() .map(|c| c == '9') .parse("9") .map(|x| x.0); assert_eq!(result, Ok(true));
fn message<S>(self, msg: S) -> Message<Self> where S: Into<Info<Self::Input::Item, Self::Input::Range>>
Parses with self
and if it fails, adds the message msg
to the error
let result = token('9') .message("Not a nine") .parse("8"); assert_eq!(result, Err(ParseError { position: <char as Positioner>::start(), errors: vec![ Error::Unexpected('8'.into()), Error::Expected('9'.into()), Error::Message("Not a nine".into()) ] }));
fn expected<S>(self, msg: S) -> Expected<Self> where S: Into<Info<Self::Input::Item, Self::Input::Range>>
Parses with self
and if it fails without consuming any input any expected errors are
replaced by msg
. msg
is then used in error messages as "Expected msg
".
let result = token('9') .expected("nine") .parse("8"); assert_eq!(result, Err(ParseError { position: <char as Positioner>::start(), errors: vec![Error::Unexpected('8'.into()), Error::Expected("nine".into())] }));
fn and_then<F, O, E>(self, f: F) -> AndThen<Self, F> where F: FnMut(Self::Output) -> Result<O, E>, E: Into<Error<Self::Input::Item, Self::Input::Range>>
Parses with self
and applies f
on the result if self
parses successfully
f
may optionally fail with an error which is automatically converted to a ParseError
let mut parser = many1(digit()) .and_then(|s: String| s.parse::<i32>()); let result = parser.parse("1234"); assert_eq!(result, Ok((1234, ""))); let err = parser.parse("abc"); assert!(err.is_err());
fn iter(self, input: State<Self::Input>) -> Iter<Self>
Creates an iterator from a parser and a state. Can be used as an alternative to many
when
collecting directly into a FromIterator
type is not desirable
let mut buffer = String::new(); let number = parser(|input| { buffer.clear(); let mut iter = digit().iter(input); buffer.extend(&mut iter); let i = buffer.parse::<i32>().unwrap(); iter.into_result(i) }); let result = sep_by(number, char(',')) .parse("123,45,6"); assert_eq!(result, Ok((vec![123, 45, 6], "")));
Implementors
impl<P: Parser> ParserExt for P