use core::{borrow::Borrow, ops::Range};
use crate::{
container::OrderedSeq,
error::{Error, Span},
input::{Input, InputType},
parser::{Emit, Mode, Parser, ParserExtras},
EmptyPhantom, IResult, MaybeRef,
};
mod choice;
mod filter;
mod just;
mod map;
mod recursive;
mod sequence;
mod take;
mod tuple;
use aott_derive::parser;
pub use choice::*;
pub use filter::*;
pub use just::just;
pub use map::*;
pub use recursive::*;
pub use sequence::*;
pub use take::*;
pub use tuple::*;
#[parser(extras = E)]
pub fn any<I: InputType, E: ParserExtras<I>>(mut input: I) -> I::Token {
match input.next_or_eof() {
Ok(ok) => Ok((input, ok)),
Err(err) => Err((input, err)),
}
}
#[derive(Copy, Clone)]
pub struct Ignored<A, OA>(pub(crate) A, pub(crate) EmptyPhantom<OA>);
impl<I: InputType, E: ParserExtras<I>, A: Parser<I, OA, E>, OA> Parser<I, (), E>
for Ignored<A, OA>
{
fn parse<'parse>(&self, input: Input<'parse, I, E>) -> IResult<'parse, I, E, ()> {
self.0.check(input)
}
fn check<'parse>(&self, input: Input<'parse, I, E>) -> IResult<'parse, I, E, ()> {
self.0.check(input)
}
}
#[parser(extras = E)]
pub fn end<I: InputType, E: ParserExtras<I>>(mut input: I) {
let offset = input.offset;
match input.next() {
Some(found) => {
let err = Error::expected_eof_found(
Span::new_usize(input.span_since(offset)),
crate::MaybeDeref::Val(found),
);
Err((input, err))
}
None => Ok((input, ())),
}
}
pub fn maybe<I: InputType, E: ParserExtras<I>, O, A: Parser<I, O, E>>(parser: A) -> Maybe<A> {
Maybe(parser)
}
#[derive(Copy, Clone)]
pub struct Maybe<A>(pub(crate) A);
impl<I: InputType, E: ParserExtras<I>, O, A: Parser<I, O, E>> Parser<I, Option<O>, E> for Maybe<A> {
fn parse<'parse>(&self, input: Input<'parse, I, E>) -> IResult<'parse, I, E, Option<O>> {
Ok(self.0.parse(input).map_or_else(
|(input, _)| (input, None),
|(input, thing)| (input, Some(thing)),
))
}
fn check<'parse>(&self, input: Input<'parse, I, E>) -> IResult<'parse, I, E, ()> {
Ok((input, ()))
}
}