#![allow(dead_code)]
use std::error;
use std::io;
use std::fmt;
use std::num;
use std::result;
use std::str;
use std::string;
pub type Result<T> = result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
ConfigFileIO(io::Error),
ConfigFileSyntax(String),
ConfigInvalidArray(&'static str),
ConfigInvalidIpv4Addr(&'static str),
ConfigInvalidSocketAddrV4(&'static str),
ConfigInvalidString(&'static str),
FileNotFound(String),
IO(io::Error),
ParseIntError(num::ParseIntError),
StringFromUtf8Error(string::FromUtf8Error),
Utf8Error(str::Utf8Error),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let msg = match *self {
Error::ConfigFileIO(ref e) => format!("Error reading configuration file: {}", e),
Error::ConfigFileSyntax(ref e) => {
format!("Syntax errors while parsing TOML configuration file:\n\n{}",
e)
}
Error::ConfigInvalidArray(ref f) => {
format!("Invalid array of values in config, field={}", f)
}
Error::ConfigInvalidIpv4Addr(ref f) => {
format!("Invalid Ipv4 address in config, field={}. (example: \"127.0.0.0\")",
f)
}
Error::ConfigInvalidSocketAddrV4(ref f) => {
format!("Invalid Ipv4 network address pair in config, field={}. (example: \
\"127.0.0.0:8080\")",
f)
}
Error::ConfigInvalidString(ref f) => {
format!("Invalid string value in config, field={}.", f)
}
Error::FileNotFound(ref e) => format!("File not found at: {}", e),
Error::IO(ref err) => format!("{}", err),
Error::ParseIntError(ref e) => format!("{}", e),
Error::StringFromUtf8Error(ref e) => format!("{}", e),
Error::Utf8Error(ref e) => format!("{}", e),
};
write!(f, "{}", msg)
}
}
impl error::Error for Error {
fn description(&self) -> &str {
match *self {
Error::ConfigFileIO(_) => "Unable to read the raw contents of a configuration file",
Error::ConfigFileSyntax(_) => "Error parsing contents of configuration file",
Error::ConfigInvalidArray(_) => {
"Invalid array of values encountered while parsing a configuration file"
}
Error::ConfigInvalidIpv4Addr(_) => {
"Invalid Ipv4 network address encountered while parsing a configuration file"
}
Error::ConfigInvalidSocketAddrV4(_) => {
"Invalid Ipv4 network address pair encountered while parsing a configuration file"
}
Error::ConfigInvalidString(_) => {
"Invalid string value encountered while parsing a configuration file"
}
Error::FileNotFound(_) => "File not found",
Error::IO(ref err) => err.description(),
Error::ParseIntError(_) => "Failed to parse an integer from a string!",
Error::StringFromUtf8Error(_) => "Failed to convert a string from a Vec<u8> as UTF-8",
Error::Utf8Error(_) => "Failed to interpret a sequence of bytes as a string",
}
}
}
impl From<string::FromUtf8Error> for Error {
fn from(err: string::FromUtf8Error) -> Self {
Error::StringFromUtf8Error(err)
}
}
impl From<str::Utf8Error> for Error {
fn from(err: str::Utf8Error) -> Self {
Error::Utf8Error(err)
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
Error::IO(err)
}
}
impl From<num::ParseIntError> for Error {
fn from(err: num::ParseIntError) -> Self {
Error::ParseIntError(err)
}
}