prefixopt_derive/
lib.rs

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/// Generates the `PrefixOpt` impl.
13#[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}