rbatis_codegen/codegen/
mod.rs1extern crate proc_macro;
4
5use syn::{parse_macro_input, ItemFn, Token};
6
7use proc_macro::TokenStream;
8use syn::parse::{Parse, ParseStream};
9use syn::punctuated::Punctuated;
10
11pub mod func;
12pub mod loader_html;
13pub mod parser_html;
14pub mod parser_pysql;
15pub mod string_util;
16pub mod syntax_tree_pysql;
17
18pub struct ParseArgs {
19 pub sqls: Vec<syn::LitStr>,
20}
21
22impl Parse for ParseArgs {
23 fn parse(input: ParseStream) -> syn::Result<Self> {
24 let r = Punctuated::<syn::LitStr, Token![,]>::parse_terminated(input)?;
25 Ok(Self {
26 sqls: r.into_iter().collect(),
27 })
28 }
29}
30
31pub fn expr(args: TokenStream, func: TokenStream) -> TokenStream {
32 let target_fn: ItemFn = syn::parse(func).unwrap();
34 let stream = func::impl_fn(
35 "",
36 &target_fn.sig.ident.to_string(),
37 &args.to_string(),
38 true,
39 &[],
40 )
41 .into();
42 stream
43}
44
45pub fn rb_html(args: TokenStream, func: TokenStream) -> TokenStream {
46 let args = parse_macro_input!(args as ParseArgs);
47 let target_fn = syn::parse(func).unwrap();
48 let stream = parser_html::impl_fn_html(&target_fn, &args);
49 stream
50}
51
52pub fn rb_py(args: TokenStream, func: TokenStream) -> TokenStream {
54 let args = parse_macro_input!(args as ParseArgs);
55 let target_fn = syn::parse(func).unwrap();
56 let stream = parser_pysql::impl_fn_py(&target_fn, &args);
57 stream
58}