tank_core/expression/
operand.rs

1use crate::{
2    DynQuery, Expression, OpPrecedence, Value,
3    writer::{Context, SqlWriter},
4};
5
6#[derive(Debug)]
7pub enum Operand<'a> {
8    LitBool(bool),
9    LitFloat(f64),
10    LitIdent(&'a str),
11    LitField(&'a [&'a str]),
12    LitInt(i128),
13    LitStr(&'a str),
14    LitArray(&'a [Operand<'a>]),
15    LitTuple(&'a [Operand<'a>]),
16    Null,
17    Type(Value),
18    Variable(Value),
19    Call(&'static str, &'a [&'a dyn Expression]),
20    Asterisk,
21    QuestionMark,
22}
23
24impl OpPrecedence for Operand<'_> {
25    fn precedence(&self, _writer: &dyn SqlWriter) -> i32 {
26        1_000_000
27    }
28}
29
30impl Expression for Operand<'_> {
31    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, out: &mut DynQuery) {
32        writer.write_expression_operand(context, out, self)
33    }
34}
35
36impl PartialEq for Operand<'_> {
37    fn eq(&self, other: &Self) -> bool {
38        match (self, other) {
39            (Self::LitBool(l), Self::LitBool(r)) => l == r,
40            (Self::LitFloat(l), Self::LitFloat(r)) => l == r,
41            (Self::LitIdent(l), Self::LitIdent(r)) => l == r,
42            (Self::LitField(l), Self::LitField(r)) => l == r,
43            (Self::LitInt(l), Self::LitInt(r)) => l == r,
44            (Self::LitStr(l), Self::LitStr(r)) => l == r,
45            (Self::LitArray(l), Self::LitArray(r)) => l == r,
46            (Self::LitTuple(l), Self::LitTuple(r)) => l == r,
47            (Self::Type(l), Self::Type(r)) => l.same_type(r),
48            (Self::Variable(l), Self::Variable(r)) => l == r,
49            (Self::Asterisk, Self::Asterisk) => true,
50            (Self::QuestionMark, Self::QuestionMark) => true,
51            _ => false,
52        }
53    }
54}