gluesql_core/ast/
ast_literal.rs1use {
2 crate::ast::ToSql,
3 bigdecimal::BigDecimal,
4 serde::{Deserialize, Serialize},
5 strum_macros::Display,
6};
7
8#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
9pub enum AstLiteral {
10 Boolean(bool),
11 Number(BigDecimal),
12 QuotedString(String),
13 HexString(String),
14 Null,
15}
16
17impl ToSql for AstLiteral {
18 fn to_sql(&self) -> String {
19 match self {
20 AstLiteral::Boolean(b) => b.to_string().to_uppercase(),
21 AstLiteral::Number(n) => n.to_string(),
22 AstLiteral::QuotedString(qs) => format!("'{qs}'"),
23 AstLiteral::HexString(hs) => format!("'{hs}'"),
24 AstLiteral::Null => "NULL".to_owned(),
25 }
26 }
27}
28
29#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display)]
30#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
31pub enum DateTimeField {
32 Year,
33 Month,
34 Day,
35 Hour,
36 Minute,
37 Second,
38}
39
40#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Display)]
41#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
42pub enum TrimWhereField {
43 Both,
44 Leading,
45 Trailing,
46}
47
48#[cfg(test)]
49mod tests {
50 use {
51 crate::ast::{AstLiteral, ToSql},
52 bigdecimal::BigDecimal,
53 };
54
55 #[test]
56 fn to_sql() {
57 assert_eq!("TRUE", AstLiteral::Boolean(true).to_sql());
58 assert_eq!("123", AstLiteral::Number(BigDecimal::from(123)).to_sql());
59 assert_eq!(
60 "'hello'",
61 AstLiteral::QuotedString("hello".to_owned()).to_sql()
62 );
63 assert_eq!("NULL", AstLiteral::Null.to_sql());
64 }
65}