Skip to main content

tank_core/expression/
ordered.rs

1use crate::{
2    DynQuery, Expression, ExpressionVisitor, OpPrecedence,
3    writer::{Context, SqlWriter},
4};
5use proc_macro2::TokenStream;
6use quote::{ToTokens, TokenStreamExt, quote};
7
8#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
9pub enum Order {
10    #[default]
11    ASC,
12    DESC,
13}
14
15impl ToTokens for Order {
16    fn to_tokens(&self, tokens: &mut TokenStream) {
17        tokens.append_all(match self {
18            Order::ASC => quote!(::tank::Order::ASC),
19            Order::DESC => quote!(::tank::Order::DESC),
20        });
21    }
22}
23
24#[derive(Debug)]
25pub struct Ordered<E: Expression> {
26    pub expression: E,
27    pub order: Order,
28}
29
30impl<E: Expression> OpPrecedence for Ordered<E> {
31    fn precedence(&self, writer: &dyn SqlWriter) -> i32 {
32        self.expression.precedence(writer)
33    }
34}
35
36impl<E: Expression> Expression for Ordered<E> {
37    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, out: &mut DynQuery) {
38        writer.write_expression_ordered(
39            context,
40            out,
41            &Ordered {
42                expression: &self.expression,
43                order: self.order,
44            },
45        );
46    }
47
48    fn accept_visitor(
49        &self,
50        matcher: &mut dyn ExpressionVisitor,
51        writer: &dyn SqlWriter,
52        context: &mut Context,
53        out: &mut DynQuery,
54    ) -> bool {
55        matcher.visit_ordered(
56            writer,
57            context,
58            out,
59            &Ordered {
60                expression: &self.expression,
61                order: self.order,
62            },
63        )
64    }
65}