bitvec_nom2/
lib.rs

1//! This crate provides input types for [nom parser combinators](https://crates.io/crates/nom)
2//! using [bitvec](https://crates.io/crates/bitvec).
3//! With those, you can use common nom combinators directly on streams of bits.
4//!
5//! ## Example
6//!
7//! ```rust,ignore
8//! let data = [0xA5u8, 0x69, 0xF0, 0xC3];
9//! let bits = data.view_bits::<Msb0>();
10//!
11//! fn parser(bits: &BitSlice<Msb0, u8>) -> IResult<&BitSlice<Msb0, u8>, &BitSlice<Msb0, u8>> {
12//!   tag(bits![1, 0, 1, 0])(bits)
13//! }
14//!
15//! assert_eq!(parser(bits), Ok((&bits[..4], &bits[4..])));
16//! ```
17#![no_std]
18
19extern crate alloc;
20
21use bitvec::prelude::*;
22
23mod input;
24
25#[derive(Copy, Clone, Debug, PartialEq, Eq)]
26#[repr(transparent)]
27pub struct BSlice<'a, T: BitStore, O: BitOrder>(pub &'a BitSlice<T, O>);
28pub struct BArray<T: BitStore, O: BitOrder>(pub BitArray<T, O>);
29
30impl<'a, T: BitStore, O: BitOrder> From<&'a BitSlice<T, O>> for BSlice<'a, T, O> {
31    fn from(slice: &'a BitSlice<T, O>) -> Self {
32        Self(slice)
33    }
34}
35
36impl<'a, T: BitStore, O: BitOrder> From<BSlice<'a, T, O>> for &'a BitSlice<T, O> {
37    fn from(slice: BSlice<'a, T, O>) -> Self {
38        slice.0
39    }
40}
41
42impl<'a, T: BitStore, O: BitOrder> core::ops::Deref for BSlice<'_, T, O> {
43    type Target = BitSlice<T, O>;
44
45    fn deref(&self) -> &Self::Target {
46        self.0
47    }
48}
49
50impl<T: BitStore, O: BitOrder> From<BitArray<T, O>> for BArray<T, O> {
51    fn from(slice: BitArray<T, O>) -> Self {
52        Self(slice)
53    }
54}
55
56impl<T: BitStore, O: BitOrder> From<BArray<T, O>> for BitArray<T, O> {
57    fn from(slice: BArray<T, O>) -> Self {
58        slice.0
59    }
60}
61
62impl<'a, T: BitStore, O: BitOrder> core::ops::Deref for BArray<T, O> {
63    type Target = BitArray<T, O>;
64
65    fn deref(&self) -> &Self::Target {
66        &self.0
67    }
68}