diff options
Diffstat (limited to 'src/db')
| -rw-r--r-- | src/db/mod.rs | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/db/mod.rs b/src/db/mod.rs index b9c59ef..36d888f 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -97,24 +97,33 @@ pub enum Error { pub trait NotFound { type Ok; + type Error; + fn not_found<E, F>(self, map: F) -> Result<Self::Ok, E> where - E: From<sqlx::Error>, + E: From<Self::Error>, F: FnOnce() -> E; + + fn optional(self) -> Result<Option<Self::Ok>, Self::Error>; } impl<T> NotFound for Result<T, sqlx::Error> { type Ok = T; + type Error = sqlx::Error; + + fn optional(self) -> Result<Option<T>, sqlx::Error> { + match self { + Ok(value) => Ok(Some(value)), + Err(sqlx::Error::RowNotFound) => Ok(None), + Err(other) => Err(other), + } + } 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), - } + self.optional()?.ok_or_else(map) } } |
