use std::{error::Error, fmt};
pub struct MoreError {
text: String,
}
impl MoreError {
fn from_error<E>(err: &E, file: &str, line: u32, func: &str, text: &str) -> Self
where
E: Error,
{
Self {
text: format!("Error: {}:{:3} {}() {}\nError: {:?}", file, line, func, text, err),
}
}
fn from_more(err: &Self, file: &str, line: u32, func: &str, text: &str) -> Self {
Self {
text: format!("Error: {}:{:3} {}() {}\n{}", file, line, func, text, err.text),
}
}
pub fn new(file: &str, line: u32, func: &str, text: &str) -> Self {
Self {
text: format!("Error: {}:{:3} {}() {}", file, line, func, text),
}
}
}
impl fmt::Debug for MoreError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.text.fmt(f)
}
}
impl fmt::Display for MoreError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.text.fmt(f)
}
}
pub trait AddMoreError<T> {
fn f<F>(self, file_line_func_func: (&str, u32, &str, F)) -> Result<T, MoreError>
where
F: Fn() -> String;
fn m(self, file_line_func_text: (&str, u32, &str, &str)) -> Result<T, MoreError>;
fn p(&self, file_line_func_text: (&str, u32, &str, &str));
}
pub trait AsMoreError<T> {
fn as_m(self, file_line_func_text: (&str, u32, &str, &str)) -> Result<T, MoreError>;
fn to_m(self) -> Result<T, MoreError>;
}
pub trait LessError<T, E> {
fn l(self) -> Result<T, E>;
}
impl<T, E> AddMoreError<T> for Result<T, E>
where
E: Error,
{
fn f<F>(self, file_line_func_func: (&str, u32, &str, F)) -> Result<T, MoreError>
where
F: Fn() -> String,
{
self.map_err(|err| {
MoreError::from_error(
&err,
file_line_func_func.0,
file_line_func_func.1,
file_line_func_func.2,
&file_line_func_func.3(),
)
})
}
fn m(self, file_line_func_text: (&str, u32, &str, &str)) -> Result<T, MoreError> {
self.map_err(|err| {
MoreError::from_error(
&err,
file_line_func_text.0,
file_line_func_text.1,
file_line_func_text.2,
file_line_func_text.3,
)
})
}
fn p(&self, file_line_func_text: (&str, u32, &str, &str)) {
if let Err(err) = self {
println!(
"{}",
MoreError::from_error(
err,
file_line_func_text.0,
file_line_func_text.1,
file_line_func_text.2,
file_line_func_text.3,
)
);
}
}
}
impl<T, E> AddMoreError<T> for &E
where
E: Error,
{
fn f<F>(self, file_line_func_func: (&str, u32, &str, F)) -> Result<T, MoreError>
where
F: Fn() -> String,
{
Err(MoreError::from_error(
self,
file_line_func_func.0,
file_line_func_func.1,
file_line_func_func.2,
&file_line_func_func.3(),
))
}
fn m(self, file_line_func_text: (&str, u32, &str, &str)) -> Result<T, MoreError> {
Err(MoreError::from_error(
self,
file_line_func_text.0,
file_line_func_text.1,
file_line_func_text.2,
file_line_func_text.3,
))
}
fn p(&self, file_line_func_text: (&str, u32, &str, &str)) {
println!(
"{}",
MoreError::from_error(
self,
file_line_func_text.0,
file_line_func_text.1,
file_line_func_text.2,
file_line_func_text.3,
)
);
}
}
impl<T> AddMoreError<T> for Result<T, MoreError> {
fn f<F>(self, file_line_func_func: (&str, u32, &str, F)) -> Result<T, MoreError>
where
F: Fn() -> String,
{
self.map_err(|err| {
MoreError::from_more(
&err,
file_line_func_func.0,
file_line_func_func.1,
file_line_func_func.2,
&file_line_func_func.3(),
)
})
}
fn m(self, file_line_func_text: (&str, u32, &str, &str)) -> Result<T, MoreError> {
self.map_err(|err| {
MoreError::from_more(
&err,
file_line_func_text.0,
file_line_func_text.1,
file_line_func_text.2,
file_line_func_text.3,
)
})
}
fn p(&self, file_line_func_text: (&str, u32, &str, &str)) {
if let Err(err) = self {
println!(
"{}",
MoreError::from_more(
err,
file_line_func_text.0,
file_line_func_text.1,
file_line_func_text.2,
file_line_func_text.3,
)
);
}
}
}
impl<T> AddMoreError<T> for &MoreError {
fn f<F>(self, file_line_func_func: (&str, u32, &str, F)) -> Result<T, MoreError>
where
F: Fn() -> String,
{
Err(MoreError::from_more(
self,
file_line_func_func.0,
file_line_func_func.1,
file_line_func_func.2,
&file_line_func_func.3(),
))
}
fn m(self, file_line_func_text: (&str, u32, &str, &str)) -> Result<T, MoreError> {
Err(MoreError::from_more(
self,
file_line_func_text.0,
file_line_func_text.1,
file_line_func_text.2,
file_line_func_text.3,
))
}
fn p(&self, file_line_func_text: (&str, u32, &str, &str)) {
println!(
"{}",
MoreError::from_more(
self,
file_line_func_text.0,
file_line_func_text.1,
file_line_func_text.2,
file_line_func_text.3,
)
);
}
}
impl<T, E> AsMoreError<T> for Result<T, E>
where
E: Error,
{
fn as_m(self, file_line_func_text: (&str, u32, &str, &str)) -> Result<T, MoreError> {
self.map_err(|_| {
MoreError::new(
file_line_func_text.0,
file_line_func_text.1,
file_line_func_text.2,
file_line_func_text.3,
)
})
}
fn to_m(self) -> Result<T, MoreError> {
self.map_err(|err| MoreError {
text: format!("{:?}", err),
})
}
}
impl<T, E> LessError<T, E> for Result<Result<T, E>, E> {
fn l(self) -> Result<T, E> {
self.and_then(|x| x)
}
}