Skip to main content

asn1_compiler/generator/asn/types/constructed/
seqof.rs

1//! Implementation of Code Generation for `SEQUENCE OF` ASN Type
2
3use 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}