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;
17pub mod syntax_tree_html;
18
19pub struct ParseArgs {
20    pub sqls: Vec<syn::LitStr>,
21}
22
23// 实现Clone特性
24impl 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 args = parse_macro_input!(args as AttributeArgs);
47    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
66/// support py_sql fn convert
67pub 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}