Skip to main content

rusqlite_struct/
rusqlite_struct_helper.rs

1use rusqlite::{Connection, Result};
2use serde_rusqlite::{from_rows, to_params_named};
3
4use crate::RusqliteStruct;
5
6/// The name of the struct must be the same as the one used in the DB table.
7pub trait RusqliteStructHelper {
8    fn insert_into_table_struct<T: RusqliteStruct + serde::Serialize>(&self, from: &T) -> Result<()>;
9    fn get_from_table_struct<T: RusqliteStruct + for<'a> serde::Deserialize<'a>>(&self) -> Result<Vec<T>>;
10}
11
12impl RusqliteStructHelper for Connection {
13    fn insert_into_table_struct<T: RusqliteStruct + serde::Serialize>(&self, from: &T) -> Result<()> {
14        let to_execute = format!(
15            "INSERT INTO {} ({}) VALUES ({})",
16            T::struct_name(),
17            format!("{}", T::field_names().join(",")),
18            format!("{}", T::field_names().iter().map(|s| format!(":{}", s)).collect::<Vec<String>>().join(","))
19        );
20
21        self.execute(&to_execute, to_params_named(from).unwrap().to_slice().as_slice())?;
22
23        Ok(())
24    }
25
26    fn get_from_table_struct<T: RusqliteStruct + for<'a> serde::Deserialize<'a>>(&self) -> Result<Vec<T>> {
27        let mut stmt = self.prepare(
28            format!("SELECT {} FROM {}", T::field_names().join(","), T::struct_name()).as_str()
29        )?;
30        let rows = stmt.query([])?;
31
32        from_rows::<T>(rows)
33            .map(|r| r.map_err(|e| rusqlite::Error::ToSqlConversionFailure(Box::new(e))))
34            .collect::<rusqlite::Result<Vec<_>>>()
35    }
36}