diff options
Diffstat (limited to 'vendor/winnow/src/trace/internals.rs')
-rw-r--r-- | vendor/winnow/src/trace/internals.rs | 63 |
1 files changed, 60 insertions, 3 deletions
diff --git a/vendor/winnow/src/trace/internals.rs b/vendor/winnow/src/trace/internals.rs index b990ae7c7..c38b11eea 100644 --- a/vendor/winnow/src/trace/internals.rs +++ b/vendor/winnow/src/trace/internals.rs @@ -4,6 +4,63 @@ use std::io::Write; use crate::error::ErrMode; use crate::stream::Stream; +use crate::*; + +pub struct Trace<P, D, I, O, E> +where + P: Parser<I, O, E>, + I: Stream, + D: std::fmt::Display, +{ + parser: P, + name: D, + call_count: usize, + i: core::marker::PhantomData<I>, + o: core::marker::PhantomData<O>, + e: core::marker::PhantomData<E>, +} + +impl<P, D, I, O, E> Trace<P, D, I, O, E> +where + P: Parser<I, O, E>, + I: Stream, + D: std::fmt::Display, +{ + #[inline(always)] + pub fn new(parser: P, name: D) -> Self { + Self { + parser, + name, + call_count: 0, + i: Default::default(), + o: Default::default(), + e: Default::default(), + } + } +} + +impl<P, D, I, O, E> Parser<I, O, E> for Trace<P, D, I, O, E> +where + P: Parser<I, O, E>, + I: Stream, + D: std::fmt::Display, +{ + #[inline] + fn parse_next(&mut self, i: &mut I) -> PResult<O, E> { + let depth = Depth::new(); + let original = i.checkpoint(); + start(*depth, &self.name, self.call_count, i); + + let res = self.parser.parse_next(i); + + let consumed = i.offset_from(&original); + let severity = Severity::with_result(&res); + end(*depth, &self.name, self.call_count, consumed, severity); + self.call_count += 1; + + res + } +} pub struct Depth { depth: usize, @@ -107,7 +164,7 @@ pub fn start<I: Stream>( (debug_slice, eof) }; - let writer = anstyle_stream::stderr(); + let writer = anstream::stderr(); let mut writer = writer.lock(); let _ = writeln!( writer, @@ -159,7 +216,7 @@ pub fn end( ), }; - let writer = anstyle_stream::stderr(); + let writer = anstream::stderr(); let mut writer = writer.lock(); let _ = writeln!( writer, @@ -197,7 +254,7 @@ pub fn result(depth: usize, name: &dyn crate::lib::std::fmt::Display, severity: ), }; - let writer = anstyle_stream::stderr(); + let writer = anstream::stderr(); let mut writer = writer.lock(); let _ = writeln!( writer, |