use std::fmt;
use std::error::Error as StdError;
#[derive(Debug, PartialEq)]
pub enum Error {
UnknownError(u32, u32),
ReadFileError,
IllegalToken(String, u32, u32),
MissingClosingParenthesis(String, u32, u32),
MissingDirectionSeparator(u32, u32),
MissingGroupIdentifier(u32, u32),
MissingTestIdentifier(u32, u32),
MissingOptionIdentifier(u32, u32),
MissingOptionSeparator(u32, u32),
MissingOptionValue(u32, u32),
MissingContent(String, u32, u32),
InvalidLineStart(u32, u32),
InvalidOptionValue(String, u32, u32),
InvalidOutputContent(String, u32, u32),
UnknownTestOption(String, u32, u32),
UnknownGroupOption(String, u32, u32)
}
impl fmt::Display for Error {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
match *self {
Error::UnknownError(line, column) => formatter.write_fmt(format_args!("Unknown error at {}:{}", line, column)),
Error::ReadFileError => formatter.write_str("Unable to read file"),
Error::IllegalToken(ref value, line, column) => formatter.write_fmt(format_args!("Illegal token '{}' at {}:{}", value, line, column)),
Error::MissingClosingParenthesis(ref value, line, column) => formatter.write_fmt(format_args!("Missing closing parenthesis '{}' at {}:{}", value, line, column)),
Error::MissingDirectionSeparator(line, column) => formatter.write_fmt(format_args!("Missing direction separator at {}:{}", line, column)),
Error::MissingGroupIdentifier(line, column) => formatter.write_fmt(format_args!("Missing group identifier at {}:{}", line, column)),
Error::MissingTestIdentifier(line, column) => formatter.write_fmt(format_args!("Missing test identifier at {}:{}", line, column)),
Error::MissingOptionIdentifier(line, column) => formatter.write_fmt(format_args!("Missing option identifier at {}:{}", line, column)),
Error::MissingOptionSeparator(line, column) => formatter.write_fmt(format_args!("Missing option separator '=' at {}:{}", line, column)),
Error::MissingOptionValue(line, column) => formatter.write_fmt(format_args!("Missing option value at {}:{}", line, column)),
Error::MissingContent(ref content_type, line, column) => formatter.write_fmt(format_args!("Missing test {} at {}:{}", content_type, line, column)),
Error::InvalidLineStart(line, column) => formatter.write_fmt(format_args!("Invalid line start at {}:{}", line, column)),
Error::InvalidOptionValue(ref expected_type, line, column) => formatter.write_fmt(format_args!("Invalid option type at {}:{}. {} type expected", line, column, expected_type)),
Error::InvalidOutputContent(ref content, line, column) => formatter.write_fmt(format_args!("Invalid output content '{}' at {}:{}", content, line, column)),
Error::UnknownTestOption(ref name, line, column) => formatter.write_fmt(format_args!("Unknown test option '{}' at {}:{}", name, line, column)),
Error::UnknownGroupOption(ref name, line, column) => formatter.write_fmt(format_args!("Unknown group option '{}' at {}:{}", name, line, column))
}
}
}
impl StdError for Error {
fn description(&self) -> &str {
match *self {
Error::UnknownError(_, _) => "Unknown error",
Error::ReadFileError => "File file error",
Error::IllegalToken(_, _, _) => "Illegal token",
Error::MissingClosingParenthesis(_, _, _) => "Missing closing parenthesis",
Error::MissingDirectionSeparator(_, _) => "Missing direction separator",
Error::MissingGroupIdentifier(_, _) => "Missing group identifier",
Error::MissingTestIdentifier(_, _) => "Missing test identifier",
Error::MissingOptionIdentifier(_, _) => "Missing option identifier",
Error::MissingOptionSeparator(_, _) => "Missing option separator",
Error::MissingOptionValue(_, _) => "Missing option value",
Error::MissingContent(_, _, _) => "Missing test content",
Error::InvalidLineStart(_, _) => "Invalid line start",
Error::InvalidOptionValue(_, _, _) => "Invalid option value",
Error::InvalidOutputContent(_, _, _) => "Invalid output content",
Error::UnknownTestOption(_, _, _) => "Unknown test option",
Error::UnknownGroupOption(_, _, _) => "Unknown group option"
}
}
}