Skip to main content

easy_sql/traits/
insert.rs

1use anyhow::Context;
2use easy_macros::always_context;
3
4use crate::traits::{Driver, DriverArguments};
5
6#[always_context]
7/// Insert payload mapping for a table.
8///
9/// Prefer implementing this trait via the [`Insert`](macro@crate::Insert) derive macro; manual
10/// implementations may need updates across releases.
11pub trait Insert<'a, Table, D: Driver> {
12    fn insert_columns() -> Vec<String>;
13
14    /// Returns (new arguments list, number of inserted rows)
15    fn insert_values(
16        self,
17        args_list: DriverArguments<'a, D>,
18    ) -> anyhow::Result<(DriverArguments<'a, D>, usize)>;
19}
20
21#[always_context]
22impl<'a, Table, T: Insert<'a, Table, D>, D: Driver> Insert<'a, Table, D> for Vec<T> {
23    fn insert_columns() -> Vec<String> {
24        T::insert_columns()
25    }
26
27    fn insert_values(
28        self,
29        args_list: DriverArguments<'a, D>,
30    ) -> anyhow::Result<(DriverArguments<'a, D>, usize)> {
31        let mut args = args_list;
32        let mut item_count = 0;
33        for item in self.into_iter() {
34            let (new_args, new_count) = item.insert_values(
35                #[context(no)]
36                args,
37            )?;
38            args = new_args;
39            item_count += new_count;
40        }
41        Ok((args, item_count))
42    }
43}
44
45#[always_context]
46impl<'a, Table, T: Insert<'a, Table, D>, D: Driver> Insert<'a, Table, D> for &'a Vec<T>
47where
48    &'a T: Insert<'a, Table, D>,
49{
50    fn insert_columns() -> Vec<String> {
51        T::insert_columns()
52    }
53
54    fn insert_values(
55        self,
56        args_list: DriverArguments<'a, D>,
57    ) -> anyhow::Result<(DriverArguments<'a, D>, usize)> {
58        let mut args = args_list;
59        let mut item_count = 0;
60        for item in self.iter() {
61            let (new_args, new_count) = item.insert_values(
62                #[context(no)]
63                args,
64            )?;
65            args = new_args;
66            item_count += new_count;
67        }
68        Ok((args, item_count))
69    }
70}
71
72#[always_context]
73impl<'a, Table, T: Insert<'a, Table, D>, D: Driver> Insert<'a, Table, D> for &'a [T]
74where
75    &'a T: Insert<'a, Table, D>,
76{
77    fn insert_columns() -> Vec<String> {
78        T::insert_columns()
79    }
80
81    fn insert_values(
82        self,
83        args_list: DriverArguments<'a, D>,
84    ) -> anyhow::Result<(DriverArguments<'a, D>, usize)> {
85        let mut args = args_list;
86        let mut item_count = 0;
87        for item in self.iter() {
88            let (new_args, new_count) = item.insert_values(
89                #[context(no)]
90                args,
91            )?;
92            args = new_args;
93            item_count += new_count;
94        }
95        Ok((args, item_count))
96    }
97}