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