gluesql_core/ast/
ast_literal.rs

1use {
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}