pen_ffi_macro/
lib.rs

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}