diff options
Diffstat (limited to 'vendor/nom/src/bits/streaming.rs')
-rw-r--r-- | vendor/nom/src/bits/streaming.rs | 41 |
1 files changed, 41 insertions, 0 deletions
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)))); + } } |