rust-dnsbox/lib/dnsbox-derive/src/lib.rs

64 lines
1.3 KiB
Rust

#![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()
}