64 lines
1.3 KiB
Rust
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()
|
|
}
|