taitan_orm_parser/template_parser/structs/atomics/
mysql_atomic.rs

1use crate::template::MaybeValue;
2use crate::template_parser::structs::bool_value::Bool;
3use crate::template_parser::structs::keyword::{MySqlKeyword};
4use crate::template_parser::structs::text::Text;
5use crate::template_parser::to_sql::SqlSegment;
6use crate::{Atomic, Number, Operator, Sign, ToSqlSegment};
7use nom::branch::alt;
8use nom::bytes::complete::tag_no_case;
9use nom::combinator::map;
10use nom::IResult;
11use taitan_orm_tracing::debug;
12use crate::template_parser::structs::atomics::atomic_trait::AtomicTrait;
13
14#[derive(Debug, Clone, PartialEq)]
15pub enum MySqlAtomic {
16    Null,
17    Number(Number),
18    Text(Text),
19    Bool(Bool),
20    Operator(Operator), // 各类操作符+-*/% like in = > < <> !=
21    Maybe(MaybeValue),  // 可能是Number/Text/Bool/Operator
22    Sign(Sign),         // 各种特殊符号,例如括号()[]{}等
23    Keyword(MySqlKeyword),
24}
25impl AtomicTrait for MySqlAtomic {
26    fn parse(input: &str) -> IResult<&str, MySqlAtomic> {
27        debug!("MySqlAtomic parse({})", &input);
28        let (remaining, parsed) = alt((
29            map(tag_no_case("null"), |_| MySqlAtomic::Null),
30            map(Number::parse, MySqlAtomic::Number),
31            map(Text::parse, MySqlAtomic::Text),
32            map(Bool::parse, MySqlAtomic::Bool),
33            map(Sign::parse, MySqlAtomic::Sign), // 需要保证+ - * 先被解析为Sign, + - 可能是number修饰符,也可能是算术操作符,*可能是算术操作符,也可能是星号
34            map(Operator::parse, MySqlAtomic::Operator),
35            map(MySqlKeyword::parse, MySqlAtomic::Keyword),
36            map(MaybeValue::parse, MySqlAtomic::Maybe),
37        ))(input)?;
38        debug!("MySqlAtomic parse -> {:?}", &parsed);
39        Ok((remaining, parsed))
40    }
41}
42
43impl ToSqlSegment for MySqlAtomic {
44    fn gen_sql_segment(&self) -> SqlSegment {
45        match self {
46            MySqlAtomic::Null=>SqlSegment::Simple("NULL".to_string()),
47            MySqlAtomic::Sign(s) => SqlSegment::Simple(s.to_string()),
48            MySqlAtomic::Maybe(m) => {
49                SqlSegment::Simple(m.gen_sql_segment().to_sql(false).to_string())
50            }
51            MySqlAtomic::Operator(b) => SqlSegment::Simple(b.to_string()),
52            MySqlAtomic::Bool(b) => SqlSegment::Simple(b.to_string()),
53            MySqlAtomic::Text(t) => SqlSegment::Simple(t.to_string()),
54            MySqlAtomic::Number(n) => SqlSegment::Simple(n.to_string()),
55            MySqlAtomic::Keyword(k) => SqlSegment::Simple(k.to_string()),
56        }
57    }
58}