use fsqlite_error::FrankenError;
pub trait OptionalExtension<T> {
fn optional(self) -> Result<Option<T>, FrankenError>;
}
impl<T> OptionalExtension<T> for Result<T, FrankenError> {
fn optional(self) -> Result<Option<T>, FrankenError> {
match self {
Ok(val) => Ok(Some(val)),
Err(FrankenError::QueryReturnedNoRows) => Ok(None),
Err(e) => Err(e),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ok_becomes_some() {
let result: Result<i32, FrankenError> = Ok(42);
assert_eq!(result.optional().unwrap(), Some(42));
}
#[test]
fn no_rows_becomes_none() {
let result: Result<i32, FrankenError> = Err(FrankenError::QueryReturnedNoRows);
assert_eq!(result.optional().unwrap(), None);
}
#[test]
fn other_error_passes_through() {
let result: Result<i32, FrankenError> = Err(FrankenError::DatabaseFull);
let err = result.optional().unwrap_err();
assert!(matches!(err, FrankenError::DatabaseFull));
}
}