rasn/types/strings/
bit.rs

1use crate::error::DecodeError;
2use crate::prelude::*;
3///  The `BIT STRING` type.
4/// /// ## Usage
5/// ASN1 declaration such as ...
6/// ```asn
7/// Test-type-a ::= BIT STRING
8/// ```
9/// ... can be represented using `rasn` as ...
10/// ```rust
11/// use rasn::prelude::*;
12///
13/// #[derive(AsnType, Decode, Encode)]
14/// #[rasn(delegate)]
15/// struct TestTypeA(pub BitString);
16/// ```
17pub type BitString = bitvec::vec::BitVec<u8, bitvec::order::Msb0>;
18///  A fixed length `BIT STRING` type.
19pub type FixedBitString<const N: usize> = bitvec::array::BitArray<[u8; N], bitvec::order::Msb0>;
20///  A reference to a `BIT STRING` type.
21pub type BitStr = bitvec::slice::BitSlice<u8, bitvec::order::Msb0>;
22
23impl AsnType for BitString {
24    const TAG: Tag = Tag::BIT_STRING;
25}
26
27impl Decode for BitString {
28    fn decode_with_tag_and_constraints<D: Decoder>(
29        decoder: &mut D,
30        tag: Tag,
31        constraints: Constraints,
32    ) -> Result<Self, D::Error> {
33        decoder.decode_bit_string(tag, constraints)
34    }
35}
36
37impl Encode for BitString {
38    fn encode_with_tag_and_constraints<E: Encoder>(
39        &self,
40        encoder: &mut E,
41        tag: Tag,
42        constraints: Constraints,
43    ) -> Result<(), E::Error> {
44        encoder.encode_bit_string(tag, constraints, self).map(drop)
45    }
46}
47
48impl AsnType for BitStr {
49    const TAG: Tag = Tag::BIT_STRING;
50}
51
52impl Encode for BitStr {
53    fn encode_with_tag_and_constraints<E: Encoder>(
54        &self,
55        encoder: &mut E,
56        tag: Tag,
57        constraints: Constraints,
58    ) -> Result<(), E::Error> {
59        encoder.encode_bit_string(tag, constraints, self).map(drop)
60    }
61}
62
63impl<const N: usize> AsnType for FixedBitString<N> {
64    const TAG: Tag = Tag::BIT_STRING;
65}
66
67impl<const N: usize> Decode for FixedBitString<N> {
68    fn decode_with_tag_and_constraints<D: Decoder>(
69        decoder: &mut D,
70        tag: Tag,
71        constraints: Constraints,
72    ) -> Result<Self, D::Error> {
73        let out = decoder.decode_bit_string(tag, constraints)?;
74        out.as_bitslice().try_into().map_err(|_| {
75            D::Error::from(DecodeError::fixed_string_conversion_failed(
76                Tag::BIT_STRING,
77                out.as_bitslice().len(),
78                N,
79                decoder.codec(),
80            ))
81        })
82    }
83}
84
85impl<const N: usize> Encode for FixedBitString<N> {
86    fn encode_with_tag_and_constraints<E: Encoder>(
87        &self,
88        encoder: &mut E,
89        tag: Tag,
90        constraints: Constraints,
91    ) -> Result<(), E::Error> {
92        encoder.encode_bit_string(tag, constraints, self).map(drop)
93    }
94}