diff --git a/src/binary/bits/mod.rs b/src/binary/bits/mod.rs index 53eb33e3..59612165 100644 --- a/src/binary/bits/mod.rs +++ b/src/binary/bits/mod.rs @@ -69,12 +69,12 @@ where *input = rest; Ok(result) } - Err(e) => match e.into_needed() { - Ok(n) => Err(ParserError::incomplete( + Err(e) => match e.needed() { + Some(n) => Err(ParserError::incomplete( input, n.map(|u| u.get() / BYTE + 1), )), - Err(e) => Err(ErrorConvert::convert(e)), + None => Err(ErrorConvert::convert(e)), }, } }) @@ -138,16 +138,16 @@ where *bit_input = (input, 0); Ok(res) } - Err(e) => match e.into_needed() { - Ok(Needed::Unknown) => Err(ParserError::incomplete(bit_input, Needed::Unknown)), - Ok(Needed::Size(sz)) => Err(match sz.get().checked_mul(BYTE) { + Err(e) => match e.needed() { + Some(Needed::Unknown) => Err(ParserError::incomplete(bit_input, Needed::Unknown)), + Some(Needed::Size(sz)) => Err(match sz.get().checked_mul(BYTE) { Some(v) => ParserError::incomplete(bit_input, Needed::new(v)), None => ParserError::assert( bit_input, "overflow in turning needed bytes into needed bits", ), }), - Err(e) => Err(ErrorConvert::convert(e)), + None => Err(ErrorConvert::convert(e)), }, } }) diff --git a/src/combinator/debug/internals.rs b/src/combinator/debug/internals.rs index 2f38f8c0..54d15ae3 100644 --- a/src/combinator/debug/internals.rs +++ b/src/combinator/debug/internals.rs @@ -122,7 +122,7 @@ impl Severity { match result { Ok(_) => Self::Success, Err(e) if e.is_backtrack() => Self::Backtrack, - Err(e) if e.is_needed() => Self::Incomplete, + Err(e) if e.is_incomplete() => Self::Incomplete, _ => Self::Cut, } } diff --git a/src/combinator/impls.rs b/src/combinator/impls.rs index c17ac39a..fae6de1b 100644 --- a/src/combinator/impls.rs +++ b/src/combinator/impls.rs @@ -256,9 +256,9 @@ where fn parse_next(&mut self, input: &mut I) -> Result { trace("complete_err", |input: &mut I| { match (self.p).parse_next(input) { - Err(err) => match err.into_needed() { - Ok(_) => Err(ParserError::from_input(input)), - Err(err) => Err(err), + Err(err) => match err.needed() { + Some(_) => Err(ParserError::from_input(input)), + None => Err(err), }, rest => rest, } @@ -641,7 +641,7 @@ where Ok(o) => { return Ok(o); } - Err(e) if e.is_needed() => return Err(e), + Err(e) if e.is_incomplete() => return Err(e), Err(err) => err, }; let err_start = i.checkpoint(); @@ -720,7 +720,7 @@ where Ok(o) => { return Ok(Some(o)); } - Err(e) if e.is_needed() => return Err(e), + Err(e) if e.is_incomplete() => return Err(e), Err(err) => err, }; let err_start = i.checkpoint(); diff --git a/src/error.rs b/src/error.rs index f6348684..92427965 100644 --- a/src/error.rs +++ b/src/error.rs @@ -213,15 +213,15 @@ impl> ParserError for ErrMode { } #[inline(always)] - fn is_needed(&self) -> bool { + fn is_incomplete(&self) -> bool { matches!(self, ErrMode::Incomplete(_)) } #[inline(always)] - fn into_needed(self) -> Result { + fn needed(&self) -> Option { match self { - ErrMode::Incomplete(needed) => Ok(needed), - err => Err(err), + ErrMode::Incomplete(needed) => Some(*needed), + _ => None, } } } @@ -403,15 +403,20 @@ pub trait ParserError: Sized { fn into_inner(self) -> Result; /// Is more data [`Needed`] + /// + /// This must be the same as [`err.needed().is_some()`][ParserError::needed] #[inline(always)] - fn is_needed(&self) -> bool { + fn is_incomplete(&self) -> bool { false } /// Extract the [`Needed`] data, if present + /// + /// `Self::needed().is_some()` must be the same as + /// [`err.is_incomplete()`][ParserError::is_incomplete] #[inline(always)] - fn into_needed(self) -> Result { - Err(self) + fn needed(&self) -> Option { + None } } diff --git a/src/stream/recoverable.rs b/src/stream/recoverable.rs index c8b61eae..d8a54179 100644 --- a/src/stream/recoverable.rs +++ b/src/stream/recoverable.rs @@ -198,7 +198,7 @@ where err: E, ) -> Result<(), E> { if self.is_recoverable { - if err.is_needed() { + if err.is_incomplete() { Err(err) } else { self.errors