blob: 8b1b20a4eafb39633da0925850c0f4ac6aa0fdf9 [file] [log] [blame]
use crate::container::*;
use proc_macro2::Span;
use quote::quote;
use syn::{Data, Ident};
pub fn derive_ber_sequence(s: synstructure::Structure) -> proc_macro2::TokenStream {
let ast = s.ast();
let container = match &ast.data {
Data::Struct(ds) => Container::from_datastruct(ds, ast, ContainerType::Sequence),
_ => panic!("Unsupported type, cannot derive"),
};
let debug_derive = ast.attrs.iter().any(|attr| {
attr.path()
.is_ident(&Ident::new("debug_derive", Span::call_site()))
});
let impl_tryfrom = container.gen_tryfrom();
let impl_tagged = container.gen_tagged();
let ts = s.gen_impl(quote! {
extern crate asn1_rs;
#impl_tryfrom
#impl_tagged
});
if debug_derive {
eprintln!("{}", ts);
}
ts
}
pub fn derive_der_sequence(s: synstructure::Structure) -> proc_macro2::TokenStream {
let ast = s.ast();
let container = match &ast.data {
Data::Struct(ds) => Container::from_datastruct(ds, ast, ContainerType::Sequence),
_ => panic!("Unsupported type, cannot derive"),
};
let debug_derive = ast.attrs.iter().any(|attr| {
attr.path()
.is_ident(&Ident::new("debug_derive", Span::call_site()))
});
let impl_tryfrom = container.gen_tryfrom();
let impl_tagged = container.gen_tagged();
let impl_checkconstraints = container.gen_checkconstraints();
let impl_fromder = container.gen_fromder();
let ts = s.gen_impl(quote! {
extern crate asn1_rs;
#impl_tryfrom
#impl_tagged
#impl_checkconstraints
#impl_fromder
});
if debug_derive {
eprintln!("{}", ts);
}
ts
}