taitan_orm_parser/template_parser/structs/
sql_part.rs1use 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), Expr(Expr), Atomic(Atomic),
13}
14impl SqlPart {
15 pub fn parse(input: &str) -> IResult<&str, SqlPart> {
16 debug!("SqlSegment parse({}", input);
17 let (input, _) = multispace0(input)?; 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}