1use ffi_gen::{Abi, FfiGen};
2use proc_macro::TokenStream;
3use proc_macro2::TokenStream as TokenStream2;
4use quote::quote;
5
6#[proc_macro]
7pub fn ffi_gen(input: TokenStream) -> TokenStream {
8 let input: TokenStream2 = input.into();
9 (quote! {
10 #[cfg_attr(all(target_family = "wasm", target_pointer_width = "32"), ffi_gen_macro::ffi_gen_wasm_32(#input))]
11 #[cfg_attr(all(target_family = "wasm", target_pointer_width = "64"), ffi_gen_macro::ffi_gen_wasm_64(#input))]
12 #[cfg_attr(all(not(target_family = "wasm"), target_pointer_width = "32"), ffi_gen_macro::ffi_gen_native_32(#input))]
13 #[cfg_attr(all(not(target_family = "wasm"), target_pointer_width = "64"), ffi_gen_macro::ffi_gen_native_64(#input))]
14 struct Api;
15 })
16 .into()
17}
18
19#[proc_macro_attribute]
20pub fn ffi_gen_wasm_32(input: TokenStream, _: TokenStream) -> TokenStream {
21 inner_ffi_gen(input, Abi::Wasm32)
22}
23
24#[proc_macro_attribute]
25pub fn ffi_gen_wasm_64(input: TokenStream, _: TokenStream) -> TokenStream {
26 inner_ffi_gen(input, Abi::Wasm64)
27}
28
29#[proc_macro_attribute]
30pub fn ffi_gen_native_32(input: TokenStream, _: TokenStream) -> TokenStream {
31 inner_ffi_gen(input, Abi::Native32)
32}
33
34#[proc_macro_attribute]
35pub fn ffi_gen_native_64(input: TokenStream, _: TokenStream) -> TokenStream {
36 inner_ffi_gen(input, Abi::Native64)
37}
38
39fn inner_ffi_gen(input: TokenStream, abi: Abi) -> TokenStream {
40 let input = syn::parse_macro_input!(input as syn::LitStr);
41 let ffigen = FfiGen::new(input.value()).unwrap();
42 let rust = ffigen.generate_rust(abi).unwrap();
43 rust.parse().unwrap()
44}