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::{Driver, DynQuery, Entity, NA, SqlWriter};
use std::marker::PhantomData;

pub struct InsertIntoQueryBuilder<E: Entity, Values, Update> {
    pub(crate) values: Values,
    pub(crate) update: bool,
    pub(crate) _table: PhantomData<E>,
    pub(crate) _update: PhantomData<Update>,
}

impl<E: Entity> InsertIntoQueryBuilder<E, NA, NA> {
    pub fn values<'a, Values>(self, values: Values) -> InsertIntoQueryBuilder<E, Values, NA>
    where
        E: 'a,
        Values: IntoIterator<Item = &'a E>,
    {
        InsertIntoQueryBuilder {
            values,
            update: false,
            _table: Default::default(),
            _update: Default::default(),
        }
    }
}

impl<'a, E, V, U> InsertIntoQueryBuilder<E, V, U>
where
    E: Entity + 'a,
    V: IntoIterator<Item = &'a E> + Clone,
{
    pub fn get_values(&self) -> V {
        self.values.clone()
    }

    pub fn get_update(&self) -> bool {
        self.update
    }

    pub fn build<D: Driver>(&self, driver: &D) -> String {
        let writer = driver.sql_writer();
        let mut query = DynQuery::default();
        writer.write_insert::<E>(&mut query, self.values.clone(), self.update);
        query.into()
    }

    pub fn build_into<D: Driver>(&self, driver: &D, out: &mut DynQuery) {
        let writer = driver.sql_writer();
        writer.write_insert::<E>(out, self.values.clone(), self.update);
    }
}