asn1rs_model/model/
bit_string.rs

1use crate::model::lor::Error as ResolveError;
2use crate::model::lor::{ResolveState, Resolver, TryResolve, Unresolved};
3use crate::model::{Asn, Error, LitOrRef, Model, Size};
4use crate::parser::Token;
5use std::convert::TryFrom;
6use std::fmt::{Debug, Display};
7use std::iter::Peekable;
8
9#[derive(Debug, Clone, PartialOrd, PartialEq, Eq)]
10pub struct BitString<T: Display + Debug + Clone = usize> {
11    pub size: Size<T>,
12    pub constants: Vec<(String, u64)>,
13}
14
15impl<T: Iterator<Item = Token>> TryFrom<&mut Peekable<T>>
16    for BitString<<Unresolved as ResolveState>::SizeType>
17{
18    type Error = Error;
19
20    fn try_from(iter: &mut Peekable<T>) -> Result<Self, Self::Error> {
21        let constants = Model::<Asn<Unresolved>>::maybe_read_constants(
22            iter,
23            Model::<Asn<Unresolved>>::constant_u64_parser,
24        )?;
25        let size = Model::<Asn<Unresolved>>::maybe_read_size(iter)?;
26        Ok(Self { size, constants })
27    }
28}
29
30impl TryResolve<usize, BitString<usize>> for BitString<LitOrRef<usize>> {
31    fn try_resolve(
32        &self,
33        resolver: &impl Resolver<usize>,
34    ) -> Result<BitString<usize>, ResolveError> {
35        Ok(BitString {
36            size: self.size.try_resolve(resolver)?,
37            constants: self.constants.clone(),
38        })
39    }
40}