use std::borrow::Cow;
use super::*;
pub trait ResultExt<T> {
fn map_err_as_user(self, advice: &'static [&'static str]) -> Result<T, Error>;
fn wrap_err_as_user<S: Into<Cow<'static, str>> + 'static>(
self,
message: S,
advice: &'static [&'static str],
) -> Result<T, Error>;
fn map_err_as_system(self, advice: &'static [&'static str]) -> Result<T, Error>;
fn wrap_err_as_system<S: Into<Cow<'static, str>> + 'static>(
self,
message: S,
advice: &'static [&'static str],
) -> Result<T, Error>;
}
impl<T, E> ResultExt<T> for Result<T, E>
where
E: Into<Box<dyn std::error::Error + Send + Sync>> + 'static,
{
fn map_err_as_user(self, advice: &'static [&'static str]) -> Result<T, Error> {
self.map_err(|e| user(e, advice))
}
fn wrap_err_as_user<S: Into<Cow<'static, str>> + 'static>(
self,
message: S,
advice: &'static [&'static str],
) -> Result<T, Error> {
self.map_err(|e| user(wrap_user(e, message, advice), advice))
}
fn map_err_as_system(self, advice: &'static [&'static str]) -> Result<T, Error> {
self.map_err(|e| system(e, advice))
}
fn wrap_err_as_system<S: Into<Cow<'static, str>> + 'static>(
self,
message: S,
advice: &'static [&'static str],
) -> Result<T, Error> {
self.map_err(|e| system(wrap_system(e, message, advice), advice))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_into_user_error() {
let result: Result<i32, std::io::Error> = Err(std::io::Error::other("underlying error"));
let user_error = result
.map_err_as_user(&["Please check your input and try again."])
.err()
.unwrap();
assert!(user_error.is(Kind::User));
}
#[test]
fn test_into_system_error() {
let result: Result<i32, std::io::Error> = Err(std::io::Error::other("underlying error"));
let system_error = result
.map_err_as_system(&["Please check your input and try again."])
.err()
.unwrap();
assert!(system_error.is(Kind::System));
}
}