der/asn1/bit_string/allowed_len_bit_string.rs
1use core::ops::RangeInclusive;
2
3use crate::{Error, ErrorKind, Tag};
4
5/// Trait automatically derived on structs, by the `BitString` macro.
6/// Used for checking if binary data fits into defined struct.
7///
8/// ```
9/// /// Bit length of 2
10/// struct MyBitString {
11/// flag1: bool,
12/// flag2: bool,
13/// }
14/// ```
15///
16/// ```rust,ignore
17/// use der::BitString;
18///
19/// /// Bit length of 3..=4
20/// #[derive(BitString)]
21/// struct MyBitString {
22/// flag1: bool,
23/// flag2: bool,
24/// flag3: bool,
25///
26/// #[asn1(optional = "true")]
27/// flag4: bool,
28/// }
29/// ```
30pub trait AllowedLenBitString {
31 /// Implementer must specify how many bits are allowed
32 const ALLOWED_LEN_RANGE: RangeInclusive<u16>;
33
34 /// Check the bit length.
35 ///
36 /// # Errors
37 /// Returns an error if the bitstring is not in expected length range.
38 fn check_bit_len(bit_len: u16) -> Result<(), Error> {
39 let allowed_len_range = Self::ALLOWED_LEN_RANGE;
40
41 // forces allowed range to e.g. 3..=4
42 if !allowed_len_range.contains(&bit_len) {
43 Err(ErrorKind::Length {
44 tag: Tag::BitString,
45 }
46 .into())
47 } else {
48 Ok(())
49 }
50 }
51}