pub fn bits<I, O, E1, E2, P>(parser: P) -> impl Parser<I, O, E2>where
E1: ParseError<(I, usize)> + ErrorConvert<E2>,
E2: ParseError<I>,
I: Stream,
P: Parser<(I, usize), O, E1>,
Expand description
Converts a byte-level input to a bit-level input
See bytes
to convert it back.
Example
use winnow::prelude::*;
use winnow::Bytes;
use winnow::bits::{bits, take};
use winnow::error::Error;
type Stream<'i> = &'i Bytes;
fn stream(b: &[u8]) -> Stream<'_> {
Bytes::new(b)
}
fn parse(input: Stream<'_>) -> IResult<Stream<'_>, (u8, u8)> {
bits::<_, _, Error<(_, usize)>, _, _>((take(4usize), take(8usize))).parse_next(input)
}
let input = stream(&[0x12, 0x34, 0xff, 0xff]);
let output = parse(input).expect("We take 1.5 bytes and the input is longer than 2 bytes");
// The first byte is consumed, the second byte is partially consumed and dropped.
let remaining = output.0;
assert_eq!(remaining, stream(&[0xff, 0xff]));
let parsed = output.1;
assert_eq!(parsed.0, 0x01);
assert_eq!(parsed.1, 0x23);