asn1rs_model/model/
bit_string.rs1use 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}