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},
};

#[derive(Clone, Copy, PartialEq, Debug)]
pub enum UnaryOpType {
    Negative,
    Not,
}
impl OpPrecedence for UnaryOpType {
    fn precedence(&self, writer: &dyn SqlWriter) -> i32 {
        writer.expression_unary_op_precedence(self)
    }
}

#[derive(Debug)]
pub struct UnaryOp<V: Expression> {
    pub op: UnaryOpType,
    pub arg: V,
}

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

impl<E: Expression> Expression for UnaryOp<E> {
    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, out: &mut DynQuery) {
        writer.write_unary_op(
            context,
            out,
            &UnaryOp {
                op: self.op,
                arg: &self.arg,
            },
        )
    }

    fn accept_visitor(
        &self,
        matcher: &mut dyn ExpressionVisitor,
        writer: &dyn SqlWriter,
        context: &mut Context,
        out: &mut DynQuery,
    ) -> bool {
        matcher.visit_unary_op(
            writer,
            context,
            out,
            &UnaryOp {
                op: self.op,
                arg: &self.arg,
            },
        )
    }
}