use std::{error::Error, fmt, io};
pub struct MoreError {
err: String,
}
impl MoreError {
fn from_error<E>(err: E, file: &str, line: u32, func: &str, text: &str) -> Self
where
E: Error,
{
Self {
err: format!("Error: {}:{:3} {}() {}\nError: {:?}", file, line, func, text, err),
}
}
fn from_more(err: Self, file: &str, line: u32, func: &str, text: &str) -> Self {
Self {
err: format!("Error: {}:{:3} {}() {}\n{}", file, line, func, text, err),
}
}
pub fn new(file: &str, line: u32, func: &str, text: &str) -> Self {
Self {
err: format!("Error: {}:{:3} {}() {}", file, line, func, text),
}
}
}
impl fmt::Debug for MoreError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.err.fmt(f)
}
}
impl fmt::Display for MoreError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.err.fmt(f)
}
}
pub trait AddMore<T> {
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));
}
impl<T, E> AddMore<T> for Result<T, E>
where
E: Error,
{
fn m(self, file_line_func_text: (&str, u32, &str, &str)) -> Result<T, MoreError> {
self.or_else(|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> AddMore<T> for io::Error {
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> AddMore<T> for Result<T, MoreError> {
fn m(self, file_line_func_text: (&str, u32, &str, &str)) -> Result<T, MoreError> {
self.or_else(|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,
)
);
}
}
}