use crate::error::DecodeError;
use crate::prelude::*;
pub type BitString = bitvec::vec::BitVec<u8, bitvec::order::Msb0>;
pub type FixedBitString<const N: usize> = bitvec::array::BitArray<[u8; N], bitvec::order::Msb0>;
pub type BitStr = bitvec::slice::BitSlice<u8, bitvec::order::Msb0>;
impl AsnType for BitString {
const TAG: Tag = Tag::BIT_STRING;
const IDENTIFIER: Identifier = Identifier::BIT_STRING;
}
impl Decode for BitString {
fn decode_with_tag_and_constraints<D: Decoder>(
decoder: &mut D,
tag: Tag,
constraints: Constraints,
) -> Result<Self, D::Error> {
decoder.decode_bit_string(tag, constraints)
}
}
impl Encode for BitString {
fn encode_with_tag_and_constraints<'b, E: Encoder<'b>>(
&self,
encoder: &mut E,
tag: Tag,
constraints: Constraints,
identifier: Identifier,
) -> Result<(), E::Error> {
encoder
.encode_bit_string(tag, constraints, self, identifier)
.map(drop)
}
}
impl AsnType for BitStr {
const TAG: Tag = Tag::BIT_STRING;
const IDENTIFIER: Identifier = Identifier::BIT_STRING;
}
impl Encode for BitStr {
fn encode_with_tag_and_constraints<'b, E: Encoder<'b>>(
&self,
encoder: &mut E,
tag: Tag,
constraints: Constraints,
identifier: Identifier,
) -> Result<(), E::Error> {
encoder
.encode_bit_string(tag, constraints, self, identifier)
.map(drop)
}
}
impl<const N: usize> AsnType for FixedBitString<N> {
const TAG: Tag = Tag::BIT_STRING;
const CONSTRAINTS: Constraints = constraints!(size_constraint!(N));
const IDENTIFIER: Identifier = Identifier::BIT_STRING;
}
impl<const N: usize> Decode for FixedBitString<N> {
fn decode_with_tag_and_constraints<D: Decoder>(
decoder: &mut D,
tag: Tag,
constraints: Constraints,
) -> Result<Self, D::Error> {
let out = decoder.decode_bit_string(tag, constraints)?;
if out.len() != N {
return Err(D::Error::from(DecodeError::fixed_string_conversion_failed(
Tag::BIT_STRING,
out.len(),
N,
decoder.codec(),
)));
}
let mut array = Self::ZERO;
array[..out.len()].copy_from_bitslice(&out);
Ok(array)
}
}
impl<const N: usize> Encode for FixedBitString<N> {
fn encode_with_tag_and_constraints<'b, E: Encoder<'b>>(
&self,
encoder: &mut E,
tag: Tag,
constraints: Constraints,
identifier: Identifier,
) -> Result<(), E::Error> {
encoder
.encode_bit_string(tag, constraints, &self[..N], identifier)
.map(drop)
}
}