#![allow(unused_assignments)]
extern crate proc_macro;
extern crate rbatis_codegen;
use syn::parse::{Parse, ParseStream};
use syn::punctuated::Punctuated;
use syn::{parse_macro_input, ItemFn, Token};
use crate::macros::html_sql_impl::impl_macro_html_sql;
use crate::macros::py_sql_impl::impl_macro_py_sql;
use crate::macros::sql_impl::impl_macro_sql;
use crate::proc_macro::TokenStream;
mod macros;
mod util;
struct ParseArgs {
pub sqls: Vec<syn::LitStr>,
}
impl Parse for ParseArgs {
fn parse(input: ParseStream) -> syn::Result<Self> {
let r = Punctuated::<syn::LitStr, Token![,]>::parse_terminated(input)?;
Ok(Self {
sqls: r.into_iter().collect(),
})
}
}
#[proc_macro_attribute]
pub fn sql(args: TokenStream, func: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as ParseArgs);
let target_fn: ItemFn = syn::parse(func).unwrap();
let stream = impl_macro_sql(&target_fn, &args);
#[cfg(feature = "println_gen")]
if cfg!(debug_assertions) {
use quote::ToTokens;
let func_name_ident = target_fn.sig.ident.to_token_stream();
println!(
"............#[sql] '{}'...................\n {}",
func_name_ident, stream
);
println!(".......................................................");
}
stream
}
#[proc_macro_attribute]
pub fn py_sql(args: TokenStream, func: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as ParseArgs);
let target_fn: ItemFn = syn::parse(func).unwrap();
let stream = impl_macro_py_sql(&target_fn, args);
#[cfg(feature = "println_gen")]
if cfg!(debug_assertions) {
use quote::ToTokens;
use rust_format::{Formatter, RustFmt};
let func_name_ident = target_fn.sig.ident.to_token_stream();
let stream_str = stream.to_string().replace("$crate", "rbatis");
let code = RustFmt::default()
.format_str(&stream_str)
.unwrap_or_else(|_e| stream_str.to_string());
println!(
"............#[py_sql] '{}'............\n {}",
func_name_ident, code
);
println!(".......................................................");
}
stream
}
#[proc_macro_attribute]
pub fn html_sql(args: TokenStream, item: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as ParseArgs);
if let Ok(impl_block) = syn::parse::<syn::ItemImpl>(item.clone()) {
return crate::macros::html_sql_impl::impl_macro_html_sql_impl(&impl_block, &args);
}
let target_fn: ItemFn = syn::parse(item).unwrap();
let stream = impl_macro_html_sql(&target_fn, &args, false);
#[cfg(feature = "println_gen")]
if cfg!(debug_assertions) {
use quote::ToTokens;
use rust_format::{Formatter, RustFmt};
let func_name_ident = target_fn.sig.ident.to_token_stream();
let stream_str = stream.to_string().replace("$crate", "rbatis");
let code = RustFmt::default()
.format_str(&stream_str)
.unwrap_or_else(|_e| stream_str.to_string());
println!(
"............#[html_sql] '{}'............\n {}",
func_name_ident, code
);
println!(".......................................................");
}
stream
}
#[proc_macro_attribute]
pub fn rb_py(args: TokenStream, func: TokenStream) -> TokenStream {
rbatis_codegen::rb_py(args, func)
}
#[proc_macro_attribute]
pub fn rb_html(args: TokenStream, func: TokenStream) -> TokenStream {
rbatis_codegen::rb_html(args, func)
}
#[proc_macro_attribute]
pub fn snake_name(args: TokenStream, func: TokenStream) -> TokenStream {
macros::snake_name::snake_name(args, func)
}