asn1_compiler/generator/asn/types/constructed/
seqof.rs1use proc_macro2::TokenStream;
4use quote::quote;
5
6use crate::generator::Generator;
7use crate::resolver::asn::structs::types::{
8 constructed::ResolvedConstructedType, Asn1ResolvedType,
9};
10use anyhow::Result;
11
12impl ResolvedConstructedType {
13 pub(crate) fn generate_sequence_of(
14 &self,
15 name: &str,
16 generator: &mut Generator,
17 ) -> Result<TokenStream> {
18 if let ResolvedConstructedType::SequenceOf {
19 ref ty,
20 ref size_values,
21 ..
22 } = self
23 {
24 let seq_of_type_ident = generator.to_type_ident(name);
25 let input_type_name = format!("{}_Entry", name);
26
27 let mut ty_attrs = quote! { type = "SEQUENCE-OF" };
28 if size_values.is_some() {
29 ty_attrs.extend(
30 size_values
31 .as_ref()
32 .unwrap()
33 .get_ty_size_constraints_attrs(),
34 )
35 }
36
37 let seq_of_type = Asn1ResolvedType::generate_name_maybe_aux_type(
38 ty,
39 generator,
40 Some(&input_type_name),
41 )?;
42
43 let vis = generator.get_visibility_tokens();
44 let dir = generator.generate_derive_tokens();
45
46 Ok(quote! {
47 #dir
48 #[asn(#ty_attrs)]
49 #vis struct #seq_of_type_ident(#vis Vec<#seq_of_type>);
50 })
51 } else {
52 Ok(TokenStream::new())
53 }
54 }
55}