sqlite_wasm_macro/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#![doc = include_str!("../README.md")]

extern crate proc_macro2;

use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};

#[proc_macro_attribute]
pub fn multithread(_: TokenStream, item: TokenStream) -> TokenStream {
    let ItemFn {
        sig,
        vis,
        block,
        attrs,
    } = parse_macro_input!(item as ItemFn);

    let ident = &sig.ident;
    let mut args = Vec::with_capacity(sig.inputs.len());
    for input in sig.inputs.iter() {
        let syn::FnArg::Typed(pat_type) = input else {
            unreachable!()
        };
        args.push(&pat_type.pat);
    }

    quote!(
        #(#attrs)*
        #vis #sig {
            let sqlite3 = sqlite();
            if !sqlite3.main_thread() {
                let CApiResp::#ident(ret) = call(sqlite3, CApiReq::#ident((#(#args),*))) else {
                    unreachable!()
                };
                return ret;
            }
            #block
        }
    )
    .into()
}