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 Clone for ParseArgs {
24 fn clone(&self) -> Self {
25 let mut new_sqls = Vec::new();
26 for sql in &self.sqls {
27 let content = sql.value();
28 let new_sql = syn::LitStr::new(&content, sql.span());
29 new_sqls.push(new_sql);
30 }
31 ParseArgs { sqls: new_sqls }
32 }
33}
34
35impl Parse for ParseArgs {
36 fn parse(input: ParseStream) -> syn::Result<Self> {
37 let r = Punctuated::<syn::LitStr, Token![,]>::parse_terminated(input)?;
38 Ok(Self {
39 sqls: r.into_iter().collect(),
40 })
41 }
42}
43
44pub fn expr(args: TokenStream, func: TokenStream) -> TokenStream {
45 let target_fn: ItemFn = syn::parse(func).unwrap();
47 let stream = func::impl_fn(
48 "",
49 &target_fn.sig.ident.to_string(),
50 &args.to_string(),
51 true,
52 &[],
53 )
54 .into();
55 stream
56}
57
58pub fn rb_html(args: TokenStream, func: TokenStream) -> TokenStream {
59 let args = parse_macro_input!(args as ParseArgs);
60 let target_fn = syn::parse(func).unwrap();
61 let stream = parser_html::impl_fn_html(&target_fn, &args);
62 stream
63}
64
65pub fn rb_py(args: TokenStream, func: TokenStream) -> TokenStream {
67 let args = parse_macro_input!(args as ParseArgs);
68 let target_fn = syn::parse(func).unwrap();
69 let stream = parser_pysql::impl_fn_py(&target_fn, &args);
70 return stream;
71}