use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub struct ParseTreeError {
message: String,
line: usize
}
impl ParseTreeError {
pub fn new(msg: &str, line: usize) -> Self {
ParseTreeError {
message: String::from(msg),
line
}
}
pub fn line(&self) -> usize {
self.line
}
}
impl fmt::Display for ParseTreeError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "`{}` at line {}", self.message, self.line + 1)
}
}
impl Error for ParseTreeError {
fn description(&self) -> &str {
&self.message
}
}
#[derive(Debug)]
pub struct SerializeTreeError {
message: String,
line: usize,
statement: Option<String>
}
impl SerializeTreeError {
pub fn new(message: &str, line: usize, statement: Option<String>) -> Self {
SerializeTreeError {
message: String::from(message),
line,
statement
}
}
pub fn line(&self) -> usize {
self.line
}
pub fn statement(&self) -> &Option<String> {
&self.statement
}
}
impl fmt::Display for SerializeTreeError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let Some(statement) = &self.statement {
write!(f, "`{}` at line {} with statement {}", self.message, self.line, statement)
}
else {
write!(f, "`{}` at line {}", self.message, self.line)
}
}
}
impl Error for SerializeTreeError {
fn description(&self) -> &str {
&self.message
}
}