rbatis_codegen/codegen/
mod.rs

1/// The core logic of code generation is written in func.rs
2/// The syntax tree we use is the html tag structure loader_html.rs Element struct
3extern 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
22// 实现Clone特性
23impl 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 args = parse_macro_input!(args as AttributeArgs);
46    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
65/// support py_sql fn convert
66pub 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}