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

65 lines
1.5 KiB
Rust
Raw Normal View History

2020-03-07 15:57:47 +00:00
#![recursion_limit = "128"]
2017-12-21 12:32:14 +00:00
#[macro_use]
extern crate synstructure;
2017-12-16 20:58:18 +00:00
#[macro_use]
extern crate quote;
extern crate proc_macro2;
2017-12-16 20:58:18 +00:00
mod dns_packet_data;
2017-12-21 12:32:14 +00:00
mod dns_text_data;
mod native_enum;
mod native_flags;
2020-03-07 15:57:47 +00:00
mod rrdata;
2017-12-16 20:58:18 +00:00
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 {
2020-03-07 15:57:47 +00:00
syn::Meta::Word(_) => panic!("{:?} attribute requires an argument", attr_meta.name()),
syn::Meta::List(l) => {
if l.nested.len() != 1 {
2020-03-07 15:57:47 +00:00
panic!(
"{:?} attribute requires exactly one argument",
attr_meta.name()
);
2017-12-21 12:32:14 +00:00
}
let arg = *l.nested.first().unwrap().value();
2020-03-07 15:57:47 +00:00
quote! {#arg}
2017-12-21 12:32:14 +00:00
},
syn::Meta::NameValue(nv) => {
let lit = &nv.lit;
2020-03-07 15:57:47 +00:00
quote! {#lit}
2017-12-21 12:32:14 +00:00
},
}
}
/*
2017-12-16 20:58:18 +00:00
#[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();
2017-12-21 12:32:14 +00:00
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);
2017-12-16 20:58:18 +00:00
gen.parse().unwrap()
}
2020-03-07 15:57:47 +00:00
*/