diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2024-10-02 01:10:09 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2024-10-02 01:10:09 -0400 |
| commit | 6f07e6869bbf62903ac83c9bc061e7bde997e6a8 (patch) | |
| tree | 75fa34f83ccf207db83d3d0a34ff9963927fadf8 /src/db.rs | |
| parent | 5d3392799f88c5a3d3f9c656c73d6e8ac5c4d793 (diff) | |
Retire top-level `repo`.
This helped me discover an organizational scheme I like more.
Diffstat (limited to 'src/db.rs')
| -rw-r--r-- | src/db.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/db.rs b/src/db.rs new file mode 100644 index 0000000..93a1169 --- /dev/null +++ b/src/db.rs @@ -0,0 +1,42 @@ +use std::str::FromStr; + +use sqlx::sqlite::{SqliteConnectOptions, SqlitePool, SqlitePoolOptions}; + +pub async fn prepare(url: &str) -> sqlx::Result<SqlitePool> { + let pool = create(url).await?; + sqlx::migrate!().run(&pool).await?; + Ok(pool) +} + +async fn create(database_url: &str) -> sqlx::Result<SqlitePool> { + 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<E, F>(self, map: F) -> Result<Self::Ok, E> + where + E: From<sqlx::Error>, + F: FnOnce() -> E; +} + +impl<T> NotFound for Result<T, sqlx::Error> { + type Ok = T; + + fn not_found<E, F>(self, map: F) -> Result<T, E> + where + E: From<sqlx::Error>, + F: FnOnce() -> E, + { + match self { + Err(sqlx::Error::RowNotFound) => Err(map()), + Err(other) => Err(other.into()), + Ok(value) => Ok(value), + } + } +} |
