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