nunc 0.2.0

WIP: time tracking application
Documentation
use std::fmt;
use std::io::{
	Error as IoError,
	ErrorKind
};
use std::result::Result as StdResult;

use conciliator::{
	Inline,
	Buffer
};
use conciliator::edit::EditError;

use rusqlite::Error as SqlError;
use toml::de::Error as DeserializeError;
use toml::ser::Error as SerializeError;


pub type Result<T> = StdResult<T, Error>;

#[derive(Debug)]
pub enum Error {
	Sql(SqlError),
	Io(IoError),
	Toml(TomlError),

	NoConfig,
	Message(String),
}

#[derive(Debug)]
pub enum TomlError {
	Serialize(SerializeError),
	Deserialize(DeserializeError),
}

impl Error {
	pub fn not_found(err: &str) -> Self {
		Self::Io(
			IoError::new(ErrorKind::NotFound, err)
		)
	}
}

impl std::error::Error for Error {}

impl Inline for Error {
	fn inline(&self, buffer: &mut Buffer) {
		match self {
			Self::Sql(e) => buffer.push(e),
			Self::Io(e) => buffer.push(e),
			Self::Toml(e) => buffer.push(e),
			Self::NoConfig => buffer.push("No config file found!"),
			Self::Message(m) => buffer.push(m),
		};
	}
}

impl fmt::Display for Error {
	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
		fmt::Debug::fmt(self, f)
	}
}

impl From<IoError> for Error {
	fn from(err: IoError) -> Self {Self::Io(err)}
}
impl From<SqlError> for Error {
	fn from(err: SqlError) -> Self {Self::Sql(err)}
}
impl From<TomlError> for Error {
	fn from(err: TomlError) -> Self {Self::Toml(err)}
}
impl From<SerializeError> for Error {
	fn from(err: SerializeError) -> Self {Self::Toml(err.into())}
}
impl From<DeserializeError> for Error {
	fn from(err: DeserializeError) -> Self {Self::Toml(err.into())}
}
impl From<EditError<SerializeError>> for Error {
	fn from(err: EditError<SerializeError>) -> Self {
		match err {
			EditError::Serialize(e) => e.into(),
			EditError::Io(e) => e.into()
		}
	}
}

impl From<SerializeError> for TomlError {
	fn from(err: SerializeError) -> Self {Self::Serialize(err)}
}
impl From<DeserializeError> for TomlError {
	fn from(err: DeserializeError) -> Self {Self::Deserialize(err)}
}

impl fmt::Display for TomlError {
	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
		match self {
			Self::Serialize(e) => e.fmt(f),
			Self::Deserialize(e) => e.fmt(f)
		}
	}
}