tank_core/expression/
ordered.rs1use 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}