use sqlx::{sqlite::Sqlite, SqliteConnection, Transaction}; use crate::login::{password::StoredHash, Id, Login}; pub trait Provider { fn logins(&mut self) -> Logins; } impl<'c> Provider for Transaction<'c, Sqlite> { fn logins(&mut self) -> Logins { Logins(self) } } pub struct Logins<'t>(&'t mut SqliteConnection); impl<'c> Logins<'c> { pub async fn create( &mut self, name: &str, password_hash: &StoredHash, ) -> Result { let id = Id::generate(); let login = sqlx::query_as!( Login, r#" insert or fail into login (id, name, password_hash) values ($1, $2, $3) returning id as "id: Id", name "#, id, name, password_hash, ) .fetch_one(&mut *self.0) .await?; Ok(login) } } impl<'t> From<&'t mut SqliteConnection> for Logins<'t> { fn from(tx: &'t mut SqliteConnection) -> Self { Self(tx) } }