#![recursion_limit="128"] extern crate proc_macro; extern crate syn; #[macro_use] extern crate quote; use proc_macro::TokenStream; mod dns_packet_data; mod dns_text_data; mod rrdata; fn attr_get_single_list_arg(attr: &syn::Attribute) -> quote::Tokens { match attr.value { syn::MetaItem::List(_, ref l) => { if l.len() != 1 { panic!("{:?} attribute requires exactly one argument", attr.name()); } let arg = &l[0]; quote!{#arg} }, syn::MetaItem::NameValue(_, ref l) => { quote!{#l} }, _ => { panic!("{:?} argument requires one argument like: [#{}(...)]", attr.name(), attr.name()); }, } } #[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() } #[proc_macro_derive(RRData, attributes(RRTypeName, RRClass))] pub fn derive_rr_data(input: TokenStream) -> TokenStream { let s = input.to_string(); let ast = syn::parse_derive_input(&s).unwrap(); let gen = rrdata::build(&ast); gen.parse().unwrap() }