taitan_orm_parser/template_parser/structs/
sql_part.rs

1use crate::template_parser::structs::atomic::Atomic;
2use crate::template_parser::structs::expr::Expr;
3use crate::template_parser::structs::template_part::TemplatePart;
4use crate::template_parser::to_sql::{SqlSegment, ToSqlSegment};
5use nom::{branch::alt, character::complete::multispace0, combinator::map, IResult};
6use taitan_orm_tracing::debug;
7
8#[derive(Debug, PartialEq, Clone)]
9pub enum SqlPart {
10    Template(TemplatePart), // 模板部分
11    Expr(Expr),             // 表达式
12    Atomic(Atomic),
13}
14impl SqlPart {
15    pub fn parse(input: &str) -> IResult<&str, SqlPart> {
16        debug!("SqlSegment parse({}", input);
17        let (input, _) = multispace0(input)?; // 跳过前导空格
18        alt((
19            map(Expr::parse, SqlPart::Expr),
20            map(TemplatePart::parse, SqlPart::Template),
21            map(Atomic::parse, SqlPart::Atomic),
22        ))(input)
23    }
24}
25
26impl ToSqlSegment for SqlPart {
27    fn gen_sql_segments(&self) -> Vec<SqlSegment> {
28        match self {
29            SqlPart::Template(template) => vec![SqlSegment::Simple(template.to_string())],
30            SqlPart::Expr(expr) => expr.gen_sql_segments(),
31            SqlPart::Atomic(atomic) => atomic.gen_sql_segments(),
32        }
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39    #[test]
40    fn test_parse_binary_expr() {}
41}