#![recursion_limit="128"] #[macro_use] extern crate synstructure; #[macro_use] extern crate quote; extern crate proc_macro2; mod rrdata; mod dns_packet_data; mod dns_text_data; mod native_enum; mod native_flags; decl_derive!([DnsPacketData] => dns_packet_data::derive); decl_derive!([DnsTextData] => dns_text_data::derive); decl_derive!([RRData, attributes(RRTypeName, RRClass)] => rrdata::rrdata_derive); decl_attribute!([native_enum] => native_enum::attribute_native_enum); decl_attribute!([native_flags] => native_flags::attribute_native_flags); fn attr_get_single_list_arg(attr_meta: &syn::Meta) -> proc_macro2::TokenStream { match attr_meta { syn::Meta::Word(_) => { panic!("{:?} attribute requires an argument", attr_meta.name()) }, syn::Meta::List(l) => { if l.nested.len() != 1 { panic!("{:?} attribute requires exactly one argument", attr_meta.name()); } let arg = *l.nested.first().unwrap().value(); quote!{#arg} }, syn::Meta::NameValue(nv) => { let lit = &nv.lit; quote!{#lit} }, } } /* #[proc_macro_derive(DnsPacketData)] pub fn derive_dns_packet_data(input: TokenStream) -> TokenStream { let s = input.to_string(); let ast = syn::parse_derive_input(&s).unwrap(); let gen = dns_packet_data::build(&ast); gen.parse().unwrap() } #[proc_macro_derive(DnsTextData)] pub fn derive_dns_text_data(input: TokenStream) -> TokenStream { let s = input.to_string(); let ast = syn::parse_derive_input(&s).unwrap(); let gen = dns_text_data::build(&ast); gen.parse().unwrap() } */