asn1_rs_derive/
set.rs

1use crate::container::*;
2use proc_macro2::Span;
3use quote::quote;
4use syn::{Data, Ident};
5
6pub fn derive_ber_set(s: synstructure::Structure) -> proc_macro2::TokenStream {
7    let ast = s.ast();
8
9    let container = match &ast.data {
10        Data::Struct(ds) => Container::from_datastruct(ds, ast, ContainerType::Set),
11        _ => panic!("Unsupported type, cannot derive"),
12    };
13
14    let debug_derive = ast.attrs.iter().any(|attr| {
15        attr.meta
16            .path()
17            .is_ident(&Ident::new("debug_derive", Span::call_site()))
18    });
19
20    let impl_tryfrom = container.gen_tryfrom();
21    let impl_tagged = container.gen_tagged();
22    let ts = s.gen_impl(quote! {
23        extern crate asn1_rs;
24
25        #impl_tryfrom
26        #impl_tagged
27    });
28    if debug_derive {
29        eprintln!("{}", ts);
30    }
31    ts
32}
33
34pub fn derive_der_set(s: synstructure::Structure) -> proc_macro2::TokenStream {
35    let ast = s.ast();
36
37    let container = match &ast.data {
38        Data::Struct(ds) => Container::from_datastruct(ds, ast, ContainerType::Set),
39        _ => panic!("Unsupported type, cannot derive"),
40    };
41
42    let debug_derive = ast.attrs.iter().any(|attr| {
43        attr.meta
44            .path()
45            .is_ident(&Ident::new("debug_derive", Span::call_site()))
46    });
47    let impl_tryfrom = container.gen_tryfrom();
48    let impl_tagged = container.gen_tagged();
49    let impl_checkconstraints = container.gen_checkconstraints();
50    let impl_fromder = container.gen_fromder();
51    let ts = s.gen_impl(quote! {
52        extern crate asn1_rs;
53
54        #impl_tryfrom
55        #impl_tagged
56        #impl_checkconstraints
57        #impl_fromder
58    });
59    if debug_derive {
60        eprintln!("{}", ts);
61    }
62    ts
63}