easy-sql 0.101.1

Macro-first SQL toolkit with compile-time checked queries, optional migrations on top of sqlx.
Documentation
use anyhow::Context;
use easy_macros::always_context;

use crate::traits::{Driver, DriverArguments};

#[always_context]
/// Insert payload mapping for a table.
///
/// Prefer implementing this trait via the [`Insert`](macro@crate::Insert) derive macro; manual
/// implementations may need updates across releases.
pub trait Insert<'a, Table, D: Driver> {
    fn insert_columns() -> Vec<String>;

    /// Returns (new arguments list, number of inserted rows)
    fn insert_values(
        self,
        args_list: DriverArguments<'a, D>,
    ) -> anyhow::Result<(DriverArguments<'a, D>, usize)>;
}

#[always_context]
impl<'a, Table, T: Insert<'a, Table, D>, D: Driver> Insert<'a, Table, D> for Vec<T> {
    fn insert_columns() -> Vec<String> {
        T::insert_columns()
    }

    fn insert_values(
        self,
        args_list: DriverArguments<'a, D>,
    ) -> anyhow::Result<(DriverArguments<'a, D>, usize)> {
        let mut args = args_list;
        let mut item_count = 0;
        for item in self.into_iter() {
            let (new_args, new_count) = item.insert_values(
                #[context(no)]
                args,
            )?;
            args = new_args;
            item_count += new_count;
        }
        Ok((args, item_count))
    }
}

#[always_context]
impl<'a, Table, T: Insert<'a, Table, D>, D: Driver> Insert<'a, Table, D> for &'a Vec<T>
where
    &'a T: Insert<'a, Table, D>,
{
    fn insert_columns() -> Vec<String> {
        T::insert_columns()
    }

    fn insert_values(
        self,
        args_list: DriverArguments<'a, D>,
    ) -> anyhow::Result<(DriverArguments<'a, D>, usize)> {
        let mut args = args_list;
        let mut item_count = 0;
        for item in self.iter() {
            let (new_args, new_count) = item.insert_values(
                #[context(no)]
                args,
            )?;
            args = new_args;
            item_count += new_count;
        }
        Ok((args, item_count))
    }
}

#[always_context]
impl<'a, Table, T: Insert<'a, Table, D>, D: Driver> Insert<'a, Table, D> for &'a [T]
where
    &'a T: Insert<'a, Table, D>,
{
    fn insert_columns() -> Vec<String> {
        T::insert_columns()
    }

    fn insert_values(
        self,
        args_list: DriverArguments<'a, D>,
    ) -> anyhow::Result<(DriverArguments<'a, D>, usize)> {
        let mut args = args_list;
        let mut item_count = 0;
        for item in self.iter() {
            let (new_args, new_count) = item.insert_values(
                #[context(no)]
                args,
            )?;
            args = new_args;
            item_count += new_count;
        }
        Ok((args, item_count))
    }
}