rbatis html query lang codegen

from html logic just like: html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "https://raw.githubusercontent.com/rbatis/rbatis/master/rbatis-codegen/mybatis-3-mapper.dtd"> <mapper> <select id="select_by_condition"> `select * from biz_activity` <where> <if test="name != ''"> ` and name like #{name}` </if> <if test="dt >= '2009-12-12 00:00:00'"> ` and create_time < #{dt}` </if> <choose> <when test="true"> ` and id != '-1'` </when> <otherwise>and id != -2</otherwise> </choose> ` and ` <trim prefixOverrides=" and"> ` and name != '' ` </trim> </where> </select> </mapper>

source code for example: ```rust use rbatis::executor::Executor; use rbatis::rbdc::datetime::DateTime; use rbatis::sql::page::{Page, PageRequest};

[derive(Clone, Debug, Serialize, Deserialize)]

pub struct BizActivity { pub id: Option, pub name: Option, pub pclink: Option, pub h5link: Option, pub pcbannerimg: Option, pub h5bannerimg: Option, pub sort: Option, pub status: Option, pub remark: Option, pub createtime: Option, pub version: Option, pub deleteflag: Option, }

[html_sql("example/example.html")]

async fn selectbycondition(rb: &mut dyn Executor, page_req: &PageRequest, name: &str, dt: &DateTime) -> Vec { impled!() } ```

log 2022-08-17 17:16:23.624803 INFO rbatis::plugin::log - [rbatis] [402390551883812864] query ==> select * from biz_activity where name like ? and create_time < ? and id != '-1' and name != '' [rbatis] Args ==> ["test",DateTime("2022-08-17 17:16:23")]

How it works

1. Whenever user define html_sql method(Of course, py_sql The implementation is also based on the py_sql syntax tree escaped to html_sql)

```rust

[html_sql(r#"

"#)] async fn selectbycondition( rb: &mut dyn Executor, name: &str, a: bool, ) -> rbatis::Result> { impled!() } ```

2. RBatis expr

3. The function body is generated through the process macro via rbatis-codegen

rust // pub trait Executor{ //this is rbatis's Executor // fn exec(&mut self, sql: &str, args: Vec<Value>) -> BoxFuture<'_, Result<ExecResult, Error>>; // fn query(&mut self, sql: &str, args: Vec<Value>) -> BoxFuture<'_, Result<Value, Error>>; // } pub async fn select_by_condition( rb: &mut dyn Executor, name: &str, a: bool, ) -> rbatis::Result<Vec<BizActivity>> { let mut rb_arg_map = rbs::value::map::ValueMap::new(); rb_arg_map.insert( "name".to_string().into(), rbs::to_value(name).unwrap_or_default(), ); rb_arg_map.insert("a".to_string().into(), rbs::to_value(a).unwrap_or_default()); use rbatis::executor::RBatisRef; let driver_type = rb.rbatis_ref().driver_type()?; use rbatis::rbatis_codegen; pub fn impl_html_sql(arg: &rbs::Value, _tag: char) -> (String, Vec<rbs::Value>) { use rbatis_codegen::ops::*; let mut sql = String::with_capacity(55usize); let mut args = Vec::with_capacity(20); sql.push_str("select * from biz_activity where "); if { (&arg["name"]).op_ne(&rbs::Value::Null) } .to_owned() .into() { args.push(rbs::to_value({ &arg["name"] }).unwrap_or_default()); sql.push_str(" name like ?"); } return (sql, args); } let (mut sql, rb_args) = impl_html_sql(&rbs::Value::Map(rb_arg_map), '?'); use rbatis::executor::Executor; let r = rb.query(&sql, rb_args).await?; rbatis::decode::decode(r) }