/* * meli - error module * * Copyright 2017 Manos Pitsidianakis * * This file is part of meli. * * meli is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * meli is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with meli. If not, see . */ /*! * An error object for `melib` */ use std::borrow::Cow; use std::error::Error; use std::fmt; use std::io; use std::result; use std::str; use std::string; use nom; pub type Result = result::Result; #[derive(Debug, Clone, Deserialize, Serialize)] pub struct MeliError { pub summary: Option>, pub details: Cow<'static, str>, } impl MeliError { pub fn new(msg: M) -> MeliError where M: Into>, { MeliError { summary: None, details: msg.into(), } } pub fn set_summary(mut self, summary: M) -> MeliError where M: Into>, { self.summary = Some(summary.into()); self } } impl fmt::Display for MeliError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.details) } } impl Into for MeliError { fn into(self) -> String { self.details.into() } } impl Error for MeliError { fn description(&self) -> &str { &self.details } } impl From for MeliError { #[inline] fn from(kind: io::Error) -> MeliError { MeliError::new(kind.description().to_string()) } } impl From for MeliError { #[inline] fn from(kind: nom::IError) -> MeliError { MeliError::new(format!("{:?}", kind)) } } impl<'a> From> for MeliError { #[inline] fn from(kind: Cow<'_, str>) -> MeliError { MeliError::new(format!("{:?}", kind)) } } impl From for MeliError { #[inline] fn from(kind: string::FromUtf8Error) -> MeliError { MeliError::new(format!("{:?}", kind)) } } impl From for MeliError { #[inline] fn from(kind: str::Utf8Error) -> MeliError { MeliError::new(format!("{:?}", kind)) } } //use std::option; //impl From for MeliError { // #[inline] // fn from(kind: option::NoneError) -> MeliError { // MeliError::new(format!("{:?}", kind)) // } //} impl From> for MeliError { #[inline] fn from(kind: std::sync::PoisonError) -> MeliError { MeliError::new(format!("{}", kind)) } } #[cfg(feature = "imap_backend")] impl From> for MeliError { #[inline] fn from(kind: native_tls::HandshakeError) -> MeliError { MeliError::new(format!("{}", kind)) } } #[cfg(feature = "imap_backend")] impl From for MeliError { #[inline] fn from(kind: native_tls::Error) -> MeliError { MeliError::new(format!("{}", kind)) } } impl From for MeliError { #[inline] fn from(kind: std::num::ParseIntError) -> MeliError { MeliError::new(format!("{}", kind)) } } #[cfg(feature = "jmap_backend")] impl From for MeliError { #[inline] fn from(kind: reqwest::Error) -> MeliError { MeliError::new(format!("{}", kind)) } } #[cfg(feature = "jmap_backend")] impl From for MeliError { #[inline] fn from(kind: serde_json::error::Error) -> MeliError { MeliError::new(format!("{}", kind)) } } impl From<&str> for MeliError { #[inline] fn from(kind: &str) -> MeliError { MeliError::new(kind.to_string()) } } impl From for MeliError { #[inline] fn from(kind: String) -> MeliError { MeliError::new(kind) } }