taitan_orm_parser/template_parser/structs/atomics/
sqlite_atomic.rs1use crate::template::{MaybeValue, PostgresAtomic};
2use crate::template_parser::structs::bool_value::Bool;
3use crate::template_parser::structs::keyword::SqliteKeyword;
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 SqliteAtomic {
16 Null,
17 Number(Number),
18 Text(Text),
19 Bool(Bool),
20 Operator(Operator), Maybe(MaybeValue), Sign(Sign), Keyword(SqliteKeyword),
24}
25impl AtomicTrait for SqliteAtomic {
26 fn parse(input: &str) -> IResult<&str, SqliteAtomic> {
27 debug!("SqliteAtomic parse({})", &input);
28 let (remaining, parsed) = alt((
29 map(tag_no_case("null"), |_| SqliteAtomic::Null),
30 map(Number::parse, SqliteAtomic::Number),
31 map(Text::parse, SqliteAtomic::Text),
32 map(Bool::parse, SqliteAtomic::Bool),
33 map(Sign::parse, SqliteAtomic::Sign), map(Operator::parse, SqliteAtomic::Operator),
35 map(SqliteKeyword::parse, SqliteAtomic::Keyword),
36 map(MaybeValue::parse, SqliteAtomic::Maybe),
37 ))(input)?;
38 debug!("SqliteAtomic parse -> {:?}", &parsed);
39 Ok((remaining, parsed))
40 }
41}
42
43impl ToSqlSegment for SqliteAtomic {
44 fn gen_sql_segment(&self) -> SqlSegment {
45 match self {
46 SqliteAtomic::Null=>SqlSegment::Simple("NULL".to_string()),
47 SqliteAtomic::Sign(s) => SqlSegment::Simple(s.to_string()),
48 SqliteAtomic::Maybe(m) => {
49 SqlSegment::Simple(m.gen_sql_segment().to_sql(false).to_string())
50 }
51 SqliteAtomic::Operator(b) => SqlSegment::Simple(b.to_string()),
52 SqliteAtomic::Bool(b) => SqlSegment::Simple(b.to_string()),
53 SqliteAtomic::Text(t) => SqlSegment::Simple(t.to_string()),
54 SqliteAtomic::Number(n) => SqlSegment::Simple(n.to_string()),
55 SqliteAtomic::Keyword(k) => SqlSegment::Simple(k.to_string()),
56 }
57 }
58}