rusqlite_struct/
rusqlite_struct_helper.rs1use rusqlite::{Connection, Result};
2use serde_rusqlite::{from_rows, to_params_named};
3
4use crate::RusqliteStruct;
5
6pub 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}