1extern crate proc_macro;
2
3#[macro_use]
4mod error;
5mod convert;
6mod parse;
7mod wrapper;
8
9use quote::quote;
10use syn::parse_macro_input;
11
12use parse::XPathFnOptions;
13use wrapper::xpath_fn_wrapper;
14
15#[proc_macro_attribute]
16pub fn xpath_fn(
17 attr: proc_macro::TokenStream,
18 input: proc_macro::TokenStream,
19) -> proc_macro::TokenStream {
20 let options = parse_macro_input!(attr as XPathFnOptions);
21 let ast = parse_macro_input!(input as syn::ItemFn);
22 let wrapper = xpath_fn_wrapper(&ast, &options).unwrap_or_else(|e| e.into_compile_error());
23 quote!(
24 #ast
25 #wrapper
26 )
27 .into()
28}