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}