parsy 0.5.6

An easy-to-use, efficient parser combinators library
Documentation
use std::marker::PhantomData;

use perfect_derive::perfect_derive;

use crate::{parser::Parser, PResult, ParserInput};

#[derive(Debug)]
pub enum DebugType<'a, 'b, T> {
    Input(&'a ParserInput<'b>),
    Result(&'a PResult<T>),
}

#[perfect_derive(Debug, Clone, Copy)]
pub struct Debugging<T, P: Parser<T>, F: for<'a, 'b> Fn(DebugType<'a, 'b, T>)> {
    parser: P,
    debugger: F,
    _t: PhantomData<T>,
}

impl<T, P: Parser<T>, F: for<'a, 'b> Fn(DebugType<'a, 'b, T>)> Debugging<T, P, F> {
    pub fn new(parser: P, debugger: F) -> Self {
        Self {
            parser,
            debugger,
            _t: PhantomData,
        }
    }
}

impl<T, P: Parser<T>, F: for<'a, 'b> Fn(DebugType<'a, 'b, T>)> Parser<T> for Debugging<T, P, F> {
    fn parse_inner(&self, input: &mut ParserInput) -> PResult<T> {
        (self.debugger)(DebugType::Input(input));

        let result = self.parser.parse(input);

        (self.debugger)(DebugType::Result(&result));

        result
    }
}