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
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 args = parse_macro_input!(args as AttributeArgs);
33    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
52/// support py_sql fn convert
53pub 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}