use std::{fmt::{Debug, Display}, path::Path};
#[derive(Clone)]
pub struct FileReadingError<'p> {
filepath: &'p Path,
message: String,
line: Option<usize>,
}
impl <'p> FileReadingError<'p> {
pub fn new(filepath: &'p Path, message: String) -> Self {
FileReadingError {
filepath,
message,
line: None,
}
}
pub fn from_parsing_error(filepath: &'p Path, e:ParsingError) -> Self{
FileReadingError {
filepath,
message: e.message().clone(),
line: Some(e.line_number())
}
}
pub fn line_number(&self) -> Option<usize> {
self.line
}
pub fn filename(&self)->&'p Path {
self.filepath
}
pub fn message(&self) -> &String {
&self.message
}
}
impl Debug for FileReadingError<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(line_number) = self.line {
write!(
f,
"File \"{}\" could not be parsed at line '{line_number}' because : {}",
self.filepath.to_str().unwrap_or("INVALID UTF-8"), self.message
)
} else {
write!(
f,
"File \"{}\" could not be because : {}",
self.filepath.to_str().unwrap_or("INVALID UTF-8"), self.message
)
}
}
}
impl Display for FileReadingError<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"File \"{}\" could not be parsed because : {}",
self.filepath.to_str().unwrap_or("INVALID UTF-8"), self.message
)
}
}
#[derive(Debug, Clone)]
pub struct ParsingError {
message: String,
line_number: usize,
}
impl ParsingError{
pub fn new( message: String, line_number: usize) -> Self {
ParsingError {
message,
line_number,
}
}
pub fn line_number(&self) -> usize {
self.line_number
}
pub fn message(&self) -> &String {
&self.message
}
}
impl Display for ParsingError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"could not be parse line '{}' because : {}",
self.line_number, self.message
)
}
}