diff options
Diffstat (limited to 'vendor/nom/src/bits')
-rw-r--r-- | vendor/nom/src/bits/complete.rs | 47 | ||||
-rw-r--r-- | vendor/nom/src/bits/mod.rs | 10 | ||||
-rw-r--r-- | vendor/nom/src/bits/streaming.rs | 41 |
3 files changed, 93 insertions, 5 deletions
diff --git a/vendor/nom/src/bits/complete.rs b/vendor/nom/src/bits/complete.rs index b46bc7a27..bf36dcc2a 100644 --- a/vendor/nom/src/bits/complete.rs +++ b/vendor/nom/src/bits/complete.rs @@ -105,6 +105,29 @@ where } } +/// Parses one specific bit as a bool. +/// +/// # Example +/// ```rust +/// # use nom::bits::complete::bool; +/// # use nom::IResult; +/// # use nom::error::{Error, ErrorKind}; +/// +/// fn parse(input: (&[u8], usize)) -> IResult<(&[u8], usize), bool> { +/// bool(input) +/// } +/// +/// assert_eq!(parse(([0b10000000].as_ref(), 0)), Ok((([0b10000000].as_ref(), 1), true))); +/// assert_eq!(parse(([0b10000000].as_ref(), 1)), Ok((([0b10000000].as_ref(), 2), false))); +/// ``` +pub fn bool<I, E: ParseError<(I, usize)>>(input: (I, usize)) -> IResult<(I, usize), bool, E> +where + I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, +{ + let (res, bit): (_, u32) = take(1usize)(input)?; + Ok((res, bit != 0)) +} + #[cfg(test)] mod test { use super::*; @@ -147,4 +170,28 @@ mod test { Ok((([0b11111111].as_ref(), 4), 0b1000110100111111111111)) ); } + + #[test] + fn test_bool_0() { + let input = [0b10000000].as_ref(); + + let result: crate::IResult<(&[u8], usize), bool> = bool((input, 0)); + + assert_eq!(result, Ok(((input, 1), true))); + } + + #[test] + fn test_bool_eof() { + let input = [0b10000000].as_ref(); + + let result: crate::IResult<(&[u8], usize), bool> = bool((input, 8)); + + assert_eq!( + result, + Err(crate::Err::Error(crate::error::Error { + input: (input, 8), + code: ErrorKind::Eof + })) + ); + } } diff --git a/vendor/nom/src/bits/mod.rs b/vendor/nom/src/bits/mod.rs index 235b7973e..0d3f73db2 100644 --- a/vendor/nom/src/bits/mod.rs +++ b/vendor/nom/src/bits/mod.rs @@ -5,7 +5,7 @@ pub mod complete; pub mod streaming; use crate::error::{ErrorKind, ParseError}; -use crate::internal::{Err, IResult, Needed}; +use crate::internal::{Err, IResult, Needed, Parser}; use crate::lib::std::ops::RangeFrom; use crate::traits::{ErrorConvert, Slice}; @@ -42,9 +42,9 @@ where E1: ParseError<(I, usize)> + ErrorConvert<E2>, E2: ParseError<I>, I: Slice<RangeFrom<usize>>, - P: FnMut((I, usize)) -> IResult<(I, usize), O, E1>, + P: Parser<(I, usize), O, E1>, { - move |input: I| match parser((input, 0)) { + move |input: I| match parser.parse((input, 0)) { Ok(((rest, offset), result)) => { // If the next byte has been partially read, it will be sliced away as well. // The parser functions might already slice away all fully read bytes. @@ -88,7 +88,7 @@ where E1: ParseError<I> + ErrorConvert<E2>, E2: ParseError<(I, usize)>, I: Slice<RangeFrom<usize>> + Clone, - P: FnMut(I) -> IResult<I, O, E1>, + P: Parser<I, O, E1>, { move |(input, offset): (I, usize)| { let inner = if offset % 8 != 0 { @@ -97,7 +97,7 @@ where input.slice((offset / 8)..) }; let i = (input, offset); - match parser(inner) { + match parser.parse(inner) { Ok((rest, res)) => Ok(((rest, 0), res)), Err(Err::Incomplete(Needed::Unknown)) => Err(Err::Incomplete(Needed::Unknown)), Err(Err::Incomplete(Needed::Size(sz))) => Err(match sz.get().checked_mul(8) { diff --git a/vendor/nom/src/bits/streaming.rs b/vendor/nom/src/bits/streaming.rs index e8adc1c0d..a7c8d0a67 100644 --- a/vendor/nom/src/bits/streaming.rs +++ b/vendor/nom/src/bits/streaming.rs @@ -79,6 +79,29 @@ where } } +/// Parses one specific bit as a bool. +/// +/// # Example +/// ```rust +/// # use nom::bits::complete::bool; +/// # use nom::IResult; +/// # use nom::error::{Error, ErrorKind}; +/// +/// fn parse(input: (&[u8], usize)) -> IResult<(&[u8], usize), bool> { +/// bool(input) +/// } +/// +/// assert_eq!(parse(([0b10000000].as_ref(), 0)), Ok((([0b10000000].as_ref(), 1), true))); +/// assert_eq!(parse(([0b10000000].as_ref(), 1)), Ok((([0b10000000].as_ref(), 2), false))); +/// ``` +pub fn bool<I, E: ParseError<(I, usize)>>(input: (I, usize)) -> IResult<(I, usize), bool, E> +where + I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, +{ + let (res, bit): (_, u32) = take(1usize)(input)?; + Ok((res, bit != 0)) +} + #[cfg(test)] mod test { use super::*; @@ -126,4 +149,22 @@ mod test { })) ); } + + #[test] + fn test_bool_0() { + let input = [0b10000000].as_ref(); + + let result: crate::IResult<(&[u8], usize), bool> = bool((input, 0)); + + assert_eq!(result, Ok(((input, 1), true))); + } + + #[test] + fn test_bool_eof() { + let input = [0b10000000].as_ref(); + + let result: crate::IResult<(&[u8], usize), bool> = bool((input, 8)); + + assert_eq!(result, Err(crate::Err::Incomplete(Needed::new(1)))); + } } |