use grafen::error::GrafenError;
use ansi_term::Colour::{Yellow, Red};
use clap;
use std::error::Error;
use std::fmt;
use std::fmt::Display;
use std::io;
use std::num::{ParseFloatError, ParseIntError};
use std::result;
pub type Result<T> = result::Result<T, GrafenCliError>;
#[derive(Debug)]
pub enum UIErrorKind {
NoSelection,
BadValue(String),
Abort,
}
pub type UIResult<T> = result::Result<T, UIErrorKind>;
impl From<io::Error> for UIErrorKind {
fn from(_: io::Error) -> UIErrorKind {
UIErrorKind::BadValue("could not parse a value".to_string())
}
}
impl From<ParseFloatError> for UIErrorKind {
fn from(_: ParseFloatError) -> UIErrorKind {
UIErrorKind::BadValue("could not parse a value".to_string())
}
}
impl From<ParseIntError> for UIErrorKind {
fn from(_: ParseIntError) -> UIErrorKind {
UIErrorKind::BadValue("could not parse a value".to_string())
}
}
impl<'a, T: Display + ?Sized> From<&'a T> for UIErrorKind {
fn from(err: &'a T) -> UIErrorKind {
UIErrorKind::BadValue(err.to_string())
}
}
#[derive(Debug)]
pub enum GrafenCliError {
BadArgs(clap::Error),
IoError(io::Error),
RunError(String),
ConstructError(String),
UIError(String),
QuitWithoutSaving,
}
impl Error for GrafenCliError {
fn description(&self) -> &str {
match *self {
GrafenCliError::UIError(ref err) => err,
_ => "Unknown error",
}
}
fn cause(&self) -> Option<&Error> {
None
}
}
impl Display for GrafenCliError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let red_error = Red.paint("error:");
match *self {
GrafenCliError::BadArgs(ref err) => {
write!(f, "{}", err)
},
GrafenCliError::IoError(ref err) => {
write!(f, "{} {}", red_error, err)
},
GrafenCliError::RunError(ref err) => {
write!(f, "{} {}", red_error, err)
},
GrafenCliError::ConstructError(ref err) => {
write!(f, "{}", Yellow.paint(err.as_str()))
},
GrafenCliError::UIError(ref err) => {
write!(f, "{} {}", red_error, err)
},
GrafenCliError::QuitWithoutSaving => {
write!(f, "Exiting without saving system.")
},
}
}
}
impl<'a> From<&'a str> for GrafenCliError {
fn from(err: &'a str) -> GrafenCliError {
GrafenCliError::ConstructError(err.to_string())
}
}
impl From<io::Error> for GrafenCliError {
fn from(err: io::Error) -> GrafenCliError {
GrafenCliError::IoError(err)
}
}
impl From<clap::Error> for GrafenCliError {
fn from(err: clap::Error) -> GrafenCliError {
GrafenCliError::BadArgs(err)
}
}
impl From<GrafenError> for GrafenCliError {
fn from(err: GrafenError) -> GrafenCliError {
GrafenCliError::RunError(err.description().to_string())
}
}
impl From<UIErrorKind> for GrafenCliError {
fn from(err: UIErrorKind) -> GrafenCliError {
match err {
UIErrorKind::NoSelection => GrafenCliError::UIError("No selection".to_string()),
UIErrorKind::BadValue(err) => GrafenCliError::UIError(err),
UIErrorKind::Abort => GrafenCliError::UIError("Discarding changes".to_string()),
}
}
}