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
mod create_table;
mod drop_table;
mod insert_into;
mod select;

pub use create_table::*;
pub use drop_table::*;
pub use insert_into::*;
pub use select::*;

use crate::{Context, DynQuery, Entity, Expression, ExpressionVisitor, OpPrecedence, SqlWriter};
use std::iter;

#[derive(Default, Debug)]
pub struct QueryBuilder;

impl QueryBuilder {
    pub fn new() -> Self {
        Self {}
    }
    pub fn select<Select: ExpressionCollection>(
        self,
        select: Select,
    ) -> SelectQueryBuilder<Select, NA, NA, NA, NA, NA, NA> {
        SelectQueryBuilder {
            select,
            from: Default::default(),
            where_expr: Default::default(),
            group_by: Default::default(),
            having: Default::default(),
            order_by: Default::default(),
            limit: Default::default(),
            _l: Default::default(),
        }
    }
    pub fn insert_into<E: Entity>(self) -> InsertIntoQueryBuilder<E, NA, NA> {
        InsertIntoQueryBuilder {
            values: Default::default(),
            update: Default::default(),
            _table: Default::default(),
            _update: Default::default(),
        }
    }
    pub fn create_table<E: Entity>(self) -> CreateTableQueryBuilder<E, NA> {
        CreateTableQueryBuilder {
            if_not_exists: Default::default(),
            _table: Default::default(),
            _e: Default::default(),
        }
    }
    pub fn drop_table<E: Entity>(self) -> DropTableQueryBuilder<E, NA> {
        DropTableQueryBuilder {
            if_exists: Default::default(),
            _table: Default::default(),
            _e: Default::default(),
        }
    }
}

#[derive(Default, Debug)]
pub struct NA;

impl OpPrecedence for NA {
    fn precedence(&self, _writer: &dyn SqlWriter) -> i32 {
        0
    }
}

impl Expression for NA {
    fn write_query(&self, _writer: &dyn SqlWriter, _context: &mut Context, _out: &mut DynQuery) {}
    fn accept_visitor(
        &self,
        _matcher: &mut dyn ExpressionVisitor,
        _writer: &dyn SqlWriter,
        _context: &mut Context,
        _out: &mut DynQuery,
    ) -> bool {
        false
    }
}

pub trait ExpressionCollection {
    fn expr_iter(&self) -> impl Iterator<Item = impl Expression> + Clone;
}

impl<I> ExpressionCollection for I
where
    Self: Clone,
    I: IntoIterator,
    <I as IntoIterator>::Item: Expression,
    <I as IntoIterator>::IntoIter: Clone,
{
    #[allow(refining_impl_trait)]
    fn expr_iter(&self) -> impl Iterator<Item = <I as IntoIterator>::Item> + Clone {
        self.clone().into_iter()
    }
}

impl ExpressionCollection for NA {
    fn expr_iter(&self) -> impl Iterator<Item = impl Expression> + Clone {
        iter::empty::<&dyn Expression>()
    }
}