ffi_gen_macro/
lib.rs

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}