1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#![warn(rust_2018_idioms)]
extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::{Lit, Meta, MetaNameValue};
#[proc_macro_derive(Partial, attributes(location))]
pub fn derive_partial(tokens: TokenStream) -> TokenStream {
let ast: syn::DeriveInput = syn::parse(tokens).unwrap();
let mut location: Option<String> = None;
let name = &ast.ident;
for option in ast.attrs.into_iter() {
let option = option.parse_meta().unwrap();
match option {
Meta::NameValue(MetaNameValue {
ref path, ref lit, ..
}) if path.is_ident("location") => {
if let Lit::Str(lit) = lit {
location = Some(lit.value());
}
}
_ => {}
}
}
let location = location.unwrap();
let gen = quote! {
impl<'a> ::toml_query::read::Partial<'a> for #name {
const LOCATION : &'static str = #location;
type Output = Self;
}
};
gen.into()
}