use std::str::FromStr; use sqlx::sqlite::{SqliteConnectOptions, SqlitePool, SqlitePoolOptions}; pub async fn prepare(url: &str) -> sqlx::Result { let pool = create(url).await?; sqlx::migrate!().run(&pool).await?; Ok(pool) } async fn create(database_url: &str) -> sqlx::Result { let options = SqliteConnectOptions::from_str(database_url)? .create_if_missing(true) .optimize_on_close(true, /* analysis_limit */ None); let pool = SqlitePoolOptions::new().connect_with(options).await?; Ok(pool) } pub trait NotFound { type Ok; fn not_found(self, map: F) -> Result where E: From, F: FnOnce() -> E; } impl NotFound for Result { type Ok = T; fn not_found(self, map: F) -> Result where E: From, F: FnOnce() -> E, { match self { Err(sqlx::Error::RowNotFound) => Err(map()), Err(other) => Err(other.into()), Ok(value) => Ok(value), } } }