#![allow(unused_imports)]
use core::marker::PhantomData;
#[cfg(feature = "alloc")]
use crate::lib::std::boxed::Box;
use crate::error::{ErrorKind, FromExternalError, ParseError};
use crate::internal::*;
use crate::lib::std::borrow::Borrow;
use crate::lib::std::convert::Into;
#[cfg(feature = "std")]
use crate::lib::std::fmt::Debug;
use crate::lib::std::mem::transmute;
use crate::lib::std::ops::{Range, RangeFrom, RangeTo};
use crate::traits::{AsChar, Input, ParseTo};
use crate::traits::{Compare, CompareResult, Offset};
#[cfg(test)]
mod tests;
#[inline]
pub fn rest<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
where
T: Input,
{
Ok(input.take_split(input.input_len()))
}
#[inline]
pub fn rest_len<T, E: ParseError<T>>(input: T) -> IResult<T, usize, E>
where
T: Input,
{
let len = input.input_len();
Ok((input, len))
}
pub fn map<I, O, E: ParseError<I>, F, G>(parser: F, f: G) -> impl Parser<I, Output = O, Error = E>
where
F: Parser<I, Error = E>,
G: FnMut(<F as Parser<I>>::Output) -> O,
{
parser.map(f)
}
pub fn map_res<I: Clone, O, E: ParseError<I> + FromExternalError<I, E2>, E2, F, G>(
parser: F,
f: G,
) -> impl Parser<I, Output = O, Error = E>
where
F: Parser<I, Error = E>,
G: FnMut(<F as Parser<I>>::Output) -> Result<O, E2>,
{
parser.map_res(f)
}
pub fn map_opt<I: Clone, O, E: ParseError<I>, F, G>(
parser: F,
f: G,
) -> impl Parser<I, Output = O, Error = E>
where
F: Parser<I, Error = E>,
G: FnMut(<F as Parser<I>>::Output) -> Option<O>,
{
parser.map_opt(f)
}
pub fn map_parser<I, O, E: ParseError<I>, F, G>(
parser: F,
applied_parser: G,
) -> impl Parser<I, Output = O, Error = E>
where
F: Parser<I, Error = E>,
G: Parser<<F as Parser<I>>::Output, Output = O, Error = E>,
{
parser.and_then(applied_parser)
}
pub fn flat_map<I, O, E: ParseError<I>, F, G, H>(
parser: F,
applied_parser: G,
) -> impl Parser<I, Output = O, Error = E>
where
F: Parser<I, Error = E>,
G: FnMut(<F as Parser<I>>::Output) -> H,
H: Parser<I, Output = O, Error = E>,
{
parser.flat_map(applied_parser)
}
pub fn opt<I: Clone, E: ParseError<I>, F>(
f: F,
) -> impl Parser<I, Output = Option<<F as Parser<I>>::Output>, Error = E>
where
F: Parser<I, Error = E>,
{
Opt { parser: f }
}
pub struct Opt<F> {
parser: F,
}
impl<I, F: Parser<I>> Parser<I> for Opt<F>
where
I: Clone,
{
type Output = Option<<F as Parser<I>>::Output>;
type Error = <F as Parser<I>>::Error;
#[inline(always)]
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
let i = input.clone();
match self
.parser
.process::<OutputM<OM::Output, Check, OM::Incomplete>>(input)
{
Ok((i, o)) => Ok((i, OM::Output::map(o, Some))),
Err(Err::Error(_)) => Ok((i, OM::Output::bind(|| None))),
Err(Err::Failure(e)) => Err(Err::Failure(e)),
Err(Err::Incomplete(i)) => Err(Err::Incomplete(i)),
}
}
}
pub fn cond<I, E: ParseError<I>, F>(
b: bool,
f: F,
) -> impl Parser<I, Output = Option<<F as Parser<I>>::Output>, Error = E>
where
F: Parser<I, Error = E>,
{
Cond {
parser: if b { Some(f) } else { None },
}
}
pub struct Cond<F> {
parser: Option<F>,
}
impl<I, F> Parser<I> for Cond<F>
where
F: Parser<I>,
{
type Output = Option<<F as Parser<I>>::Output>;
type Error = <F as Parser<I>>::Error;
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
match &mut self.parser {
None => Ok((input, OM::Output::bind(|| None))),
Some(f) => f
.process::<OM>(input)
.map(|(i, o)| (i, OM::Output::map(o, Some))),
}
}
}
pub fn peek<I: Clone, F>(
parser: F,
) -> impl Parser<I, Output = <F as Parser<I>>::Output, Error = <F as Parser<I>>::Error>
where
F: Parser<I>,
{
Peek { parser }
}
pub struct Peek<F> {
parser: F,
}
impl<I, F> Parser<I> for Peek<F>
where
I: Clone,
F: Parser<I>,
{
type Output = <F as Parser<I>>::Output;
type Error = <F as Parser<I>>::Error;
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
let i = input.clone();
match self.parser.process::<OM>(input) {
Ok((_, o)) => Ok((i, o)),
Err(e) => Err(e),
}
}
}
pub fn eof<I: Input + Clone, E: ParseError<I>>(input: I) -> IResult<I, I, E> {
if input.input_len() == 0 {
let clone = input.clone();
Ok((input, clone))
} else {
Err(Err::Error(E::from_error_kind(input, ErrorKind::Eof)))
}
}
pub fn complete<I: Clone, O, E: ParseError<I>, F>(
parser: F,
) -> impl Parser<I, Output = O, Error = E>
where
F: Parser<I, Output = O, Error = E>,
{
MakeComplete { parser }
}
pub struct MakeComplete<F> {
parser: F,
}
impl<I, F> Parser<I> for MakeComplete<F>
where
I: Clone,
F: Parser<I>,
{
type Output = <F as Parser<I>>::Output;
type Error = <F as Parser<I>>::Error;
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
let i = input.clone();
match self
.parser
.process::<OutputM<OM::Output, OM::Error, Complete>>(input)
{
Err(Err::Incomplete(_)) => Err(Err::Error(OM::Error::bind(|| {
<F as Parser<I>>::Error::from_error_kind(i, ErrorKind::Complete)
}))),
Err(e) => Err(e),
Ok(o) => Ok(o),
}
}
}
pub fn all_consuming<I, E: ParseError<I>, F>(
parser: F,
) -> impl Parser<I, Output = <F as Parser<I>>::Output, Error = E>
where
I: Input,
F: Parser<I, Error = E>,
{
AllConsuming { parser }
}
pub struct AllConsuming<F> {
parser: F,
}
impl<I, F> Parser<I> for AllConsuming<F>
where
I: Input,
F: Parser<I>,
{
type Output = <F as Parser<I>>::Output;
type Error = <F as Parser<I>>::Error;
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
let (input, res) = self.parser.process::<OM>(input)?;
if input.input_len() == 0 {
Ok((input, res))
} else {
Err(Err::Error(OM::Error::bind(|| {
<F as Parser<I>>::Error::from_error_kind(input, ErrorKind::Eof)
})))
}
}
}
pub fn verify<I: Clone, O2, E: ParseError<I>, F, G>(
first: F,
second: G,
) -> impl Parser<I, Output = <F as Parser<I>>::Output, Error = E>
where
F: Parser<I, Error = E>,
G: Fn(&O2) -> bool,
<F as Parser<I>>::Output: Borrow<O2>,
O2: ?Sized,
{
Verify {
first,
second,
o2: PhantomData,
}
}
pub struct Verify<F, G, O2: ?Sized> {
first: F,
second: G,
o2: PhantomData<O2>,
}
impl<I, F: Parser<I>, G, O2> Parser<I> for Verify<F, G, O2>
where
I: Clone,
G: Fn(&O2) -> bool,
<F as Parser<I>>::Output: Borrow<O2>,
O2: ?Sized,
{
type Output = <F as Parser<I>>::Output;
type Error = <F as Parser<I>>::Error;
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
let (i, o) = self
.first
.process::<OutputM<Emit, OM::Error, OM::Incomplete>>(input.clone())?;
if (self.second)(o.borrow()) {
Ok((i, OM::Output::bind(|| o)))
} else {
Err(Err::Error(OM::Error::bind(move || {
let e: ErrorKind = ErrorKind::Verify;
<F as Parser<I>>::Error::from_error_kind(input, e)
})))
}
}
}
pub fn value<I, O1: Clone, E: ParseError<I>, F>(
val: O1,
parser: F,
) -> impl Parser<I, Output = O1, Error = E>
where
F: Parser<I, Error = E>,
{
parser.map(move |_| val.clone())
}
pub fn not<I: Clone, E: ParseError<I>, F>(parser: F) -> impl Parser<I, Output = (), Error = E>
where
F: Parser<I, Error = E>,
{
Not { parser }
}
pub struct Not<F> {
parser: F,
}
impl<I, F> Parser<I> for Not<F>
where
I: Clone,
F: Parser<I>,
{
type Output = ();
type Error = <F as Parser<I>>::Error;
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
let i = input.clone();
match self.parser.process::<OM>(input) {
Ok(_) => Err(Err::Error(OM::Error::bind(|| {
<F as Parser<I>>::Error::from_error_kind(i, ErrorKind::Not)
}))),
Err(Err::Error(_)) => Ok((i, OM::Output::bind(|| ()))),
Err(e) => Err(e),
}
}
}
pub fn recognize<I: Clone + Offset + Input, E: ParseError<I>, F>(
parser: F,
) -> impl Parser<I, Output = I, Error = E>
where
F: Parser<I, Error = E>,
{
Recognize { parser }
}
pub struct Recognize<F> {
parser: F,
}
impl<I, F> Parser<I> for Recognize<F>
where
I: Clone + Offset + Input,
F: Parser<I>,
{
type Output = I;
type Error = <F as Parser<I>>::Error;
#[inline(always)]
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
let i = input.clone();
match self
.parser
.process::<OutputM<Check, OM::Error, OM::Incomplete>>(i)
{
Ok((i, _)) => {
let index = input.offset(&i);
Ok((i, OM::Output::bind(|| input.take(index))))
}
Err(e) => Err(e),
}
}
}
pub fn consumed<I, F, E>(
parser: F,
) -> impl Parser<I, Output = (I, <F as Parser<I>>::Output), Error = E>
where
I: Clone + Offset + Input,
E: ParseError<I>,
F: Parser<I, Error = E>,
{
Consumed { parser }
}
pub struct Consumed<F> {
parser: F,
}
impl<I, F> Parser<I> for Consumed<F>
where
I: Clone + Offset + Input,
F: Parser<I>,
{
type Output = (I, <F as Parser<I>>::Output);
type Error = <F as Parser<I>>::Error;
#[inline(always)]
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
let i = input.clone();
match self.parser.process::<OM>(i) {
Ok((remaining, result)) => {
let index = input.offset(&remaining);
Ok((
remaining,
OM::Output::map(result, |res| {
let consumed = input.take(index);
(consumed, res)
}),
))
}
Err(e) => Err(e),
}
}
}
pub fn cut<I, E: ParseError<I>, F>(
parser: F,
) -> impl Parser<I, Output = <F as Parser<I>>::Output, Error = E>
where
F: Parser<I, Error = E>,
{
Cut { parser }
}
pub struct Cut<F> {
parser: F,
}
impl<I, F> Parser<I> for Cut<F>
where
F: Parser<I>,
{
type Output = <F as Parser<I>>::Output;
type Error = <F as Parser<I>>::Error;
#[inline(always)]
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
match self
.parser
.process::<OutputM<OM::Output, Emit, OM::Incomplete>>(input)
{
Err(Err::Error(e)) => Err(Err::Failure(e)),
Err(Err::Failure(e)) => Err(Err::Failure(e)),
Err(Err::Incomplete(i)) => Err(Err::Incomplete(i)),
Ok((i, o)) => Ok((i, o)),
}
}
}
pub fn into<I, O1, O2, E1, E2, F>(parser: F) -> impl Parser<I, Output = O2, Error = E2>
where
O2: From<O1>,
E2: From<E1>,
E1: ParseError<I>,
E2: ParseError<I>,
F: Parser<I, Output = O1, Error = E1>,
{
parser.into::<O2, E2>()
}
pub fn iterator<Input, Error, F>(input: Input, f: F) -> ParserIterator<Input, Error, F>
where
F: Parser<Input>,
Error: ParseError<Input>,
{
ParserIterator {
iterator: f,
input,
state: Some(State::Running),
}
}
pub struct ParserIterator<I, E, F> {
iterator: F,
input: I,
state: Option<State<E>>,
}
impl<I: Clone, E, F> ParserIterator<I, E, F> {
pub fn finish(mut self) -> IResult<I, (), E> {
match self.state.take().unwrap() {
State::Running | State::Done => Ok((self.input, ())),
State::Failure(e) => Err(Err::Failure(e)),
State::Incomplete(i) => Err(Err::Incomplete(i)),
}
}
}
impl<Input, Output, Error, F> core::iter::Iterator for ParserIterator<Input, Error, F>
where
F: Parser<Input, Output = Output, Error = Error>,
Input: Clone,
{
type Item = Output;
fn next(&mut self) -> Option<Self::Item> {
if let State::Running = self.state.take().unwrap() {
let input = self.input.clone();
match (self.iterator).parse(input) {
Ok((i, o)) => {
self.input = i;
self.state = Some(State::Running);
Some(o)
}
Err(Err::Error(_)) => {
self.state = Some(State::Done);
None
}
Err(Err::Failure(e)) => {
self.state = Some(State::Failure(e));
None
}
Err(Err::Incomplete(i)) => {
self.state = Some(State::Incomplete(i));
None
}
}
} else {
None
}
}
}
enum State<E> {
Running,
Done,
Failure(E),
Incomplete(Needed),
}
pub fn success<I, O: Clone, E: ParseError<I>>(val: O) -> impl Parser<I, Output = O, Error = E> {
Success {
val,
e: PhantomData,
}
}
pub struct Success<O: Clone, E> {
val: O,
e: PhantomData<E>,
}
impl<I, O, E> Parser<I> for Success<O, E>
where
O: Clone,
E: ParseError<I>,
{
type Output = O;
type Error = E;
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
Ok((input, OM::Output::bind(|| self.val.clone())))
}
}
pub fn fail<I, O, E: ParseError<I>>() -> impl Parser<I, Output = O, Error = E> {
Fail {
o: PhantomData,
e: PhantomData,
}
}
pub struct Fail<O, E> {
o: PhantomData<O>,
e: PhantomData<E>,
}
impl<I, O, E> Parser<I> for Fail<O, E>
where
E: ParseError<I>,
{
type Output = O;
type Error = E;
fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
Err(Err::Error(OM::Error::bind(|| {
E::from_error_kind(input, ErrorKind::Fail)
})))
}
}