tank_core/expression/
ordered.rs

1use crate::{
2    Expression, OpPrecedence,
3    writer::{Context, SqlWriter},
4};
5use proc_macro2::TokenStream;
6use quote::{ToTokens, TokenStreamExt, quote};
7
8#[derive(Debug, Clone, Copy)]
9pub enum Order {
10    ASC,
11    DESC,
12}
13
14impl ToTokens for Order {
15    fn to_tokens(&self, tokens: &mut TokenStream) {
16        tokens.append_all(match self {
17            Order::ASC => quote!(::tank::Order::ASC),
18            Order::DESC => quote!(::tank::Order::DESC),
19        });
20    }
21}
22
23#[derive(Debug)]
24pub struct Ordered<E: Expression> {
25    pub expression: E,
26    pub order: Order,
27}
28
29impl<E: Expression> OpPrecedence for Ordered<E> {
30    fn precedence(&self, writer: &dyn SqlWriter) -> i32 {
31        self.expression.precedence(writer)
32    }
33}
34
35impl<E: Expression> Expression for Ordered<E> {
36    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, buff: &mut String) {
37        writer.write_expression_ordered(
38            context,
39            buff,
40            &Ordered {
41                expression: &self.expression,
42                order: self.order,
43            },
44        );
45    }
46    fn is_ordered(&self) -> bool {
47        true
48    }
49}