use crate::error::{ContextError, ErrMode, ErrorKind, FromExternalError, ParseError}; use crate::lib::std::borrow::Borrow; use crate::lib::std::ops::Range; use crate::stream::{Location, Stream}; use crate::stream::{Offset, StreamIsPartial}; use crate::trace::trace; use crate::trace::trace_result; use crate::*; /// Implementation of [`Parser::by_ref`][Parser::by_ref] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct ByRef<'p, P> { p: &'p mut P, } impl<'p, P> ByRef<'p, P> { pub(crate) fn new(p: &'p mut P) -> Self { Self { p } } } impl<'p, I, O, E, P: Parser> Parser for ByRef<'p, P> { fn parse_next(&mut self, i: I) -> IResult { self.p.parse_next(i) } } /// Implementation of [`Parser::map`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct Map where F: Parser, G: Fn(O) -> O2, { parser: F, map: G, i: core::marker::PhantomData, o: core::marker::PhantomData, o2: core::marker::PhantomData, e: core::marker::PhantomData, } impl Map where F: Parser, G: Fn(O) -> O2, { pub(crate) fn new(parser: F, map: G) -> Self { Self { parser, map, i: Default::default(), o: Default::default(), o2: Default::default(), e: Default::default(), } } } impl Parser for Map where F: Parser, G: Fn(O) -> O2, { fn parse_next(&mut self, i: I) -> IResult { match self.parser.parse_next(i) { Err(e) => Err(e), Ok((i, o)) => Ok((i, (self.map)(o))), } } } #[deprecated(since = "0.4.2", note = "Replaced with `TryMap`")] pub use TryMap as MapRes; /// Implementation of [`Parser::try_map`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct TryMap where F: Parser, G: FnMut(O) -> Result, I: Clone, E: FromExternalError, { parser: F, map: G, i: core::marker::PhantomData, o: core::marker::PhantomData, o2: core::marker::PhantomData, e: core::marker::PhantomData, e2: core::marker::PhantomData, } impl TryMap where F: Parser, G: FnMut(O) -> Result, I: Clone, E: FromExternalError, { pub(crate) fn new(parser: F, map: G) -> Self { Self { parser, map, i: Default::default(), o: Default::default(), o2: Default::default(), e: Default::default(), e2: Default::default(), } } } impl Parser for TryMap where F: Parser, G: FnMut(O) -> Result, I: Clone, E: FromExternalError, { fn parse_next(&mut self, input: I) -> IResult { let i = input.clone(); let (input, o) = self.parser.parse_next(input)?; let res = match (self.map)(o) { Ok(o2) => Ok((input, o2)), Err(e) => Err(ErrMode::from_external_error(i, ErrorKind::Verify, e)), }; trace_result("verify", &res); res } } /// Implementation of [`Parser::verify_map`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct VerifyMap where F: Parser, G: FnMut(O) -> Option, I: Clone, E: ParseError, { parser: F, map: G, i: core::marker::PhantomData, o: core::marker::PhantomData, o2: core::marker::PhantomData, e: core::marker::PhantomData, } impl VerifyMap where F: Parser, G: FnMut(O) -> Option, I: Clone, E: ParseError, { pub(crate) fn new(parser: F, map: G) -> Self { Self { parser, map, i: Default::default(), o: Default::default(), o2: Default::default(), e: Default::default(), } } } impl Parser for VerifyMap where F: Parser, G: FnMut(O) -> Option, I: Clone, E: ParseError, { fn parse_next(&mut self, input: I) -> IResult { let i = input.clone(); let (input, o) = self.parser.parse_next(input)?; let res = match (self.map)(o) { Some(o2) => Ok((input, o2)), None => Err(ErrMode::from_error_kind(i, ErrorKind::Verify)), }; trace_result("verify", &res); res } } /// Implementation of [`Parser::and_then`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct AndThen where F: Parser, G: Parser, O: StreamIsPartial, { outer: F, inner: G, i: core::marker::PhantomData, o: core::marker::PhantomData, o2: core::marker::PhantomData, e: core::marker::PhantomData, } impl AndThen where F: Parser, G: Parser, O: StreamIsPartial, { pub(crate) fn new(outer: F, inner: G) -> Self { Self { outer, inner, i: Default::default(), o: Default::default(), o2: Default::default(), e: Default::default(), } } } impl Parser for AndThen where F: Parser, G: Parser, O: StreamIsPartial, { fn parse_next(&mut self, i: I) -> IResult { let (i, mut o) = self.outer.parse_next(i)?; let _ = o.complete(); let (_, o2) = self.inner.parse_next(o)?; Ok((i, o2)) } } /// Implementation of [`Parser::parse_to`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct ParseTo where P: Parser, I: Stream, O: crate::stream::ParseSlice, E: ParseError, { p: P, i: core::marker::PhantomData, o: core::marker::PhantomData, o2: core::marker::PhantomData, e: core::marker::PhantomData, } impl ParseTo where P: Parser, I: Stream, O: crate::stream::ParseSlice, E: ParseError, { pub(crate) fn new(p: P) -> Self { Self { p, i: Default::default(), o: Default::default(), o2: Default::default(), e: Default::default(), } } } impl Parser for ParseTo where P: Parser, I: Stream, O: crate::stream::ParseSlice, E: ParseError, { fn parse_next(&mut self, i: I) -> IResult { let input = i.clone(); let (i, o) = self.p.parse_next(i)?; let res = o .parse_slice() .ok_or_else(|| ErrMode::from_error_kind(input, ErrorKind::Verify)); trace_result("verify", &res); Ok((i, res?)) } } /// Implementation of [`Parser::flat_map`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct FlatMap where F: Parser, G: FnMut(O) -> H, H: Parser, { f: F, g: G, h: core::marker::PhantomData, i: core::marker::PhantomData, o: core::marker::PhantomData, o2: core::marker::PhantomData, e: core::marker::PhantomData, } impl FlatMap where F: Parser, G: FnMut(O) -> H, H: Parser, { pub(crate) fn new(f: F, g: G) -> Self { Self { f, g, h: Default::default(), i: Default::default(), o: Default::default(), o2: Default::default(), e: Default::default(), } } } impl Parser for FlatMap where F: Parser, G: FnMut(O) -> H, H: Parser, { fn parse_next(&mut self, i: I) -> IResult { let (i, o) = self.f.parse_next(i)?; (self.g)(o).parse_next(i) } } /// Implementation of [`Parser::complete_err`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct CompleteErr { f: F, } impl CompleteErr { pub(crate) fn new(f: F) -> Self { Self { f } } } impl Parser for CompleteErr where I: Stream, F: Parser, E: ParseError, { fn parse_next(&mut self, input: I) -> IResult { trace("complete_err", |input: I| { let i = input.clone(); match (self.f).parse_next(input) { Err(ErrMode::Incomplete(_)) => { Err(ErrMode::from_error_kind(i, ErrorKind::Complete)) } rest => rest, } }) .parse_next(input) } } /// Implementation of [`Parser::verify`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct Verify where F: Parser, G: Fn(&O2) -> bool, I: Clone, O: Borrow, O2: ?Sized, E: ParseError, { parser: F, filter: G, i: core::marker::PhantomData, o: core::marker::PhantomData, o2: core::marker::PhantomData, e: core::marker::PhantomData, } impl Verify where F: Parser, G: Fn(&O2) -> bool, I: Clone, O: Borrow, O2: ?Sized, E: ParseError, { pub(crate) fn new(parser: F, filter: G) -> Self { Self { parser, filter, i: Default::default(), o: Default::default(), o2: Default::default(), e: Default::default(), } } } impl Parser for Verify where F: Parser, G: Fn(&O2) -> bool, I: Clone, O: Borrow, O2: ?Sized, E: ParseError, { fn parse_next(&mut self, input: I) -> IResult { let i = input.clone(); let (input, o) = self.parser.parse_next(input)?; let res = if (self.filter)(o.borrow()) { Ok((input, o)) } else { Err(ErrMode::from_error_kind(i, ErrorKind::Verify)) }; trace_result("verify", &res); res } } /// Implementation of [`Parser::value`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct Value where F: Parser, O2: Clone, { parser: F, val: O2, i: core::marker::PhantomData, o: core::marker::PhantomData, e: core::marker::PhantomData, } impl Value where F: Parser, O2: Clone, { pub(crate) fn new(parser: F, val: O2) -> Self { Self { parser, val, i: Default::default(), o: Default::default(), e: Default::default(), } } } impl Parser for Value where F: Parser, O2: Clone, { fn parse_next(&mut self, input: I) -> IResult { (self.parser) .parse_next(input) .map(|(i, _)| (i, self.val.clone())) } } /// Implementation of [`Parser::void`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct Void where F: Parser, { parser: F, i: core::marker::PhantomData, o: core::marker::PhantomData, e: core::marker::PhantomData, } impl Void where F: Parser, { pub(crate) fn new(parser: F) -> Self { Self { parser, i: Default::default(), o: Default::default(), e: Default::default(), } } } impl Parser for Void where F: Parser, { fn parse_next(&mut self, input: I) -> IResult { (self.parser).parse_next(input).map(|(i, _)| (i, ())) } } /// Implementation of [`Parser::recognize`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct Recognize where F: Parser, I: Stream + Offset, { parser: F, i: core::marker::PhantomData, o: core::marker::PhantomData, e: core::marker::PhantomData, } impl Recognize where F: Parser, I: Stream + Offset, { pub(crate) fn new(parser: F) -> Self { Self { parser, i: Default::default(), o: Default::default(), e: Default::default(), } } } impl Parser::Slice, E> for Recognize where F: Parser, I: Stream + Offset, { fn parse_next(&mut self, input: I) -> IResult::Slice, E> { let i = input.clone(); match (self.parser).parse_next(i) { Ok((i, _)) => { let offset = input.offset_to(&i); Ok(input.next_slice(offset)) } Err(e) => Err(e), } } } /// Implementation of [`Parser::with_recognized`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct WithRecognized where F: Parser, I: Stream + Offset, { parser: F, i: core::marker::PhantomData, o: core::marker::PhantomData, e: core::marker::PhantomData, } impl WithRecognized where F: Parser, I: Stream + Offset, { pub(crate) fn new(parser: F) -> Self { Self { parser, i: Default::default(), o: Default::default(), e: Default::default(), } } } impl Parser::Slice), E> for WithRecognized where F: Parser, I: Stream + Offset, { fn parse_next(&mut self, input: I) -> IResult::Slice), E> { let i = input.clone(); match (self.parser).parse_next(i) { Ok((remaining, result)) => { let offset = input.offset_to(&remaining); let (remaining, recognized) = input.next_slice(offset); Ok((remaining, (result, recognized))) } Err(e) => Err(e), } } } /// Implementation of [`Parser::span`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct Span where F: Parser, I: Clone + Location, { parser: F, i: core::marker::PhantomData, o: core::marker::PhantomData, e: core::marker::PhantomData, } impl Span where F: Parser, I: Clone + Location, { pub(crate) fn new(parser: F) -> Self { Self { parser, i: Default::default(), o: Default::default(), e: Default::default(), } } } impl Parser, E> for Span where F: Parser, I: Clone + Location, { fn parse_next(&mut self, input: I) -> IResult, E> { let start = input.location(); self.parser.parse_next(input).map(move |(remaining, _)| { let end = remaining.location(); (remaining, (start..end)) }) } } /// Implementation of [`Parser::with_span`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct WithSpan where F: Parser, I: Clone + Location, { parser: F, i: core::marker::PhantomData, o: core::marker::PhantomData, e: core::marker::PhantomData, } impl WithSpan where F: Parser, I: Clone + Location, { pub(crate) fn new(parser: F) -> Self { Self { parser, i: Default::default(), o: Default::default(), e: Default::default(), } } } impl Parser), E> for WithSpan where F: Parser, I: Clone + Location, { fn parse_next(&mut self, input: I) -> IResult), E> { let start = input.location(); self.parser .parse_next(input) .map(move |(remaining, output)| { let end = remaining.location(); (remaining, (output, (start..end))) }) } } /// Implementation of [`Parser::output_into`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct OutputInto where F: Parser, O: Into, { parser: F, i: core::marker::PhantomData, o: core::marker::PhantomData, o2: core::marker::PhantomData, e: core::marker::PhantomData, } impl OutputInto where F: Parser, O: Into, { pub(crate) fn new(parser: F) -> Self { Self { parser, i: Default::default(), o: Default::default(), o2: Default::default(), e: Default::default(), } } } impl Parser for OutputInto where F: Parser, O: Into, { fn parse_next(&mut self, i: I) -> IResult { match self.parser.parse_next(i) { Ok((i, o)) => Ok((i, o.into())), Err(err) => Err(err), } } } /// Implementation of [`Parser::err_into`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct ErrInto where F: Parser, E: Into, { parser: F, i: core::marker::PhantomData, o: core::marker::PhantomData, e: core::marker::PhantomData, e2: core::marker::PhantomData, } impl ErrInto where F: Parser, E: Into, { pub(crate) fn new(parser: F) -> Self { Self { parser, i: Default::default(), o: Default::default(), e: Default::default(), e2: Default::default(), } } } impl Parser for ErrInto where F: Parser, E: Into, { fn parse_next(&mut self, i: I) -> IResult { match self.parser.parse_next(i) { Ok(ok) => Ok(ok), Err(ErrMode::Backtrack(e)) => Err(ErrMode::Backtrack(e.into())), Err(ErrMode::Cut(e)) => Err(ErrMode::Cut(e.into())), Err(ErrMode::Incomplete(e)) => Err(ErrMode::Incomplete(e)), } } } /// Implementation of [`Parser::context`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct Context where F: Parser, I: Stream, E: ContextError, C: Clone + crate::lib::std::fmt::Debug, { parser: F, context: C, i: core::marker::PhantomData, o: core::marker::PhantomData, e: core::marker::PhantomData, } impl Context where F: Parser, I: Stream, E: ContextError, C: Clone + crate::lib::std::fmt::Debug, { pub(crate) fn new(parser: F, context: C) -> Self { Self { parser, context, i: Default::default(), o: Default::default(), e: Default::default(), } } } impl Parser for Context where F: Parser, I: Stream, E: ContextError, C: Clone + crate::lib::std::fmt::Debug, { fn parse_next(&mut self, i: I) -> IResult { #[cfg(feature = "debug")] let name = format!("context={:?}", self.context); #[cfg(not(feature = "debug"))] let name = "context"; trace(name, move |i: I| { (self.parser) .parse_next(i.clone()) .map_err(|err| err.map(|err| err.add_context(i, self.context.clone()))) }) .parse_next(i) } }