1mod any;
2mod attribute_list;
3mod bindgen;
4mod into_any;
5mod utilities;
6
7use self::attribute_list::AttributeList;
8use proc_macro::TokenStream;
9use quote::quote;
10use std::error::Error;
11use syn::{parse_macro_input, ItemFn, ItemStruct};
12
13#[proc_macro_attribute]
14pub fn bindgen(attributes: TokenStream, item: TokenStream) -> TokenStream {
15 let attributes = parse_macro_input!(attributes as AttributeList);
16 let function = parse_macro_input!(item as ItemFn);
17
18 convert_result(bindgen::generate(&attributes, &function))
19}
20
21#[proc_macro_attribute]
22pub fn any(attributes: TokenStream, item: TokenStream) -> TokenStream {
23 let attributes = parse_macro_input!(attributes as AttributeList);
24 let type_ = parse_macro_input!(item as ItemStruct);
25
26 convert_result(any::generate(&attributes, &type_))
27}
28
29#[proc_macro_attribute]
30pub fn into_any(attributes: TokenStream, item: TokenStream) -> TokenStream {
31 let attributes = parse_macro_input!(attributes as AttributeList);
32 let type_ = parse_macro_input!(item as ItemStruct);
33
34 convert_result(into_any::generate(&attributes, &type_))
35}
36
37fn convert_result(result: Result<TokenStream, Box<dyn Error>>) -> TokenStream {
38 result.unwrap_or_else(|error| {
39 let message = error.to_string();
40
41 quote! { compile_error!(#message) }.into()
42 })
43}