tank_core/expression/
unary_op.rs1use crate::{
2 DynQuery, Expression, ExpressionVisitor, OpPrecedence,
3 writer::{Context, SqlWriter},
4};
5
6#[derive(Clone, Copy, PartialEq, Debug)]
7pub enum UnaryOpType {
8 Negative,
9 Not,
10}
11impl OpPrecedence for UnaryOpType {
12 fn precedence(&self, writer: &dyn SqlWriter) -> i32 {
13 writer.expression_unary_op_precedence(self)
14 }
15}
16
17#[derive(Debug)]
18pub struct UnaryOp<V: Expression> {
19 pub op: UnaryOpType,
20 pub arg: V,
21}
22
23impl<E: Expression> OpPrecedence for UnaryOp<E> {
24 fn precedence(&self, writer: &dyn SqlWriter) -> i32 {
25 writer.expression_unary_op_precedence(&self.op)
26 }
27}
28
29impl<E: Expression> Expression for UnaryOp<E> {
30 fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, out: &mut DynQuery) {
31 writer.write_expression_unary_op(
32 context,
33 out,
34 &UnaryOp {
35 op: self.op,
36 arg: &self.arg,
37 },
38 )
39 }
40
41 fn accept_visitor(
42 &self,
43 matcher: &mut dyn ExpressionVisitor,
44 writer: &dyn SqlWriter,
45 context: &mut Context,
46 out: &mut DynQuery,
47 ) -> bool {
48 matcher.visit_unary_op(
49 writer,
50 context,
51 out,
52 &UnaryOp {
53 op: self.op,
54 arg: &self.arg,
55 },
56 )
57 }
58}