tank-core 0.31.0

Core of Tank: the Rust data layer. This is intended to be used by drivers to implement a backend.
Documentation
use crate::{
    DynQuery, Expression, ExpressionVisitor, OpPrecedence,
    writer::{Context, SqlWriter},
};
use proc_macro2::TokenStream;
use quote::{ToTokens, TokenStreamExt, quote};

#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
pub enum Order {
    #[default]
    ASC,
    DESC,
}

impl ToTokens for Order {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        tokens.append_all(match self {
            Order::ASC => quote!(::tank::Order::ASC),
            Order::DESC => quote!(::tank::Order::DESC),
        });
    }
}

#[derive(Debug)]
pub struct Ordered<E: Expression> {
    pub expression: E,
    pub order: Order,
}

impl<E: Expression> OpPrecedence for Ordered<E> {
    fn precedence(&self, writer: &dyn SqlWriter) -> i32 {
        self.expression.precedence(writer)
    }
}

impl<E: Expression> Expression for Ordered<E> {
    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, out: &mut DynQuery) {
        writer.write_ordered(
            context,
            out,
            &Ordered {
                expression: &self.expression,
                order: self.order,
            },
        );
    }

    fn accept_visitor(
        &self,
        matcher: &mut dyn ExpressionVisitor,
        writer: &dyn SqlWriter,
        context: &mut Context,
        out: &mut DynQuery,
    ) -> bool {
        matcher.visit_ordered(
            writer,
            context,
            out,
            &Ordered {
                expression: &self.expression,
                order: self.order,
            },
        )
    }
}