use crate::template::MaybeValue;
use crate::template_parser::structs::bool_value::Bool;
use crate::template_parser::structs::keyword::{MySqlKeyword};
use crate::template_parser::structs::text::Text;
use crate::template_parser::to_sql::SqlSegment;
use crate::{Atomic, Number, Operator, Sign, ToSqlSegment};
use nom::branch::alt;
use nom::bytes::complete::tag_no_case;
use nom::combinator::map;
use nom::IResult;
use taitan_orm_tracing::debug;
use crate::template_parser::structs::atomics::atomic_trait::AtomicTrait;
#[derive(Debug, Clone, PartialEq)]
pub enum MySqlAtomic {
Null,
Number(Number),
Text(Text),
Bool(Bool),
Operator(Operator), Maybe(MaybeValue), Sign(Sign), Keyword(MySqlKeyword),
}
impl AtomicTrait for MySqlAtomic {
fn parse(input: &str) -> IResult<&str, MySqlAtomic> {
debug!("MySqlAtomic parse({})", &input);
let (remaining, parsed) = alt((
map(tag_no_case("null"), |_| MySqlAtomic::Null),
map(Number::parse, MySqlAtomic::Number),
map(Text::parse, MySqlAtomic::Text),
map(Bool::parse, MySqlAtomic::Bool),
map(Sign::parse, MySqlAtomic::Sign), map(Operator::parse, MySqlAtomic::Operator),
map(MySqlKeyword::parse, MySqlAtomic::Keyword),
map(MaybeValue::parse, MySqlAtomic::Maybe),
))(input)?;
debug!("MySqlAtomic parse -> {:?}", &parsed);
Ok((remaining, parsed))
}
}
impl ToSqlSegment for MySqlAtomic {
fn gen_sql_segment(&self) -> SqlSegment {
match self {
MySqlAtomic::Null=>SqlSegment::Simple("NULL".to_string()),
MySqlAtomic::Sign(s) => SqlSegment::Simple(s.to_string()),
MySqlAtomic::Maybe(m) => {
SqlSegment::Simple(m.gen_sql_segment().to_sql(false).to_string())
}
MySqlAtomic::Operator(b) => SqlSegment::Simple(b.to_string()),
MySqlAtomic::Bool(b) => SqlSegment::Simple(b.to_string()),
MySqlAtomic::Text(t) => SqlSegment::Simple(t.to_string()),
MySqlAtomic::Number(n) => SqlSegment::Simple(n.to_string()),
MySqlAtomic::Keyword(k) => SqlSegment::Simple(k.to_string()),
}
}
}