parsy 0.2.1

An easy-to-use, efficient parser combinators library
Documentation
use crate::{PResult, Parser, ParserInput};

#[derive(Clone, Copy)]
pub struct Filter<F: Fn(char) -> bool> {
    func: F,
}

impl<F: Fn(char) -> bool> Filter<F> {
    pub fn new(func: F) -> Self {
        Self { func }
    }
}

impl<F: Fn(char) -> bool> Parser<char> for Filter<F> {
    fn parse_inner(&self, input: &mut ParserInput) -> PResult<char> {
        let start = input.at();

        let c = input
            .try_eat_char()
            .ok_or_else(|| start.range(0).custom_err("No character left"))?;

        if (self.func)(c.data) {
            Ok(c)
        } else {
            Err(start.range(1).custom_err("Character filter failed"))
        }
    }
}