1extern crate proc_macro;
2extern crate syn;
3#[macro_use]
4extern crate quote;
5
6use proc_macro::TokenStream;
7use syn::*;
8mod enum_data;
9mod variant_data;
10mod generics;
11
12#[proc_macro_derive(PrefixOpt, attributes(prefixopt))]
14pub fn prefixopt(input: TokenStream) -> TokenStream {
15 let s = input.to_string();
16 let ast = syn::parse_derive_input(&s).unwrap();
17 let gen = impl_prefixopt(ast);
18 gen.parse().unwrap()
19}
20
21fn impl_prefixopt(ast: DeriveInput) -> quote::Tokens {
22 let ref ident = ast.ident;
23 let generics = generics::with_prefixopt_constraints(ast.generics);
24 let tokens = match ast.body {
25 syn::Body::Struct(_struct) => variant_data::derive(&generics, ident, &_struct),
26 syn::Body::Enum(_enum) => {
27 let generics = generics::with_default_constraints(generics);
28 enum_data::derive(&generics, ident, &_enum)
29 },
30 };
31 tokens
32}