use Value;
use hyper::Error as HyperError;
use xml::reader::Error as XmlError;
use xml::common::TextPosition;
use std::io;
use std::fmt::{self, Formatter, Display};
use std::error::Error;
#[derive(Debug)]
pub enum RequestError {
HyperError(HyperError),
ParseError(ParseError),
}
impl From<HyperError> for RequestError {
fn from(e: HyperError) -> Self {
RequestError::HyperError(e)
}
}
impl From<ParseError> for RequestError {
fn from(e: ParseError) -> Self {
RequestError::ParseError(e)
}
}
impl From<io::Error> for RequestError {
fn from(e: io::Error) -> Self {
RequestError::HyperError(HyperError::from(e))
}
}
impl Display for RequestError {
fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
match *self {
RequestError::HyperError(ref err) => write!(fmt, "HTTP error: {}", err),
RequestError::ParseError(ref err) => write!(fmt, "parse error: {}", err),
}
}
}
impl Error for RequestError {
fn description(&self) -> &str {
match *self {
RequestError::HyperError(ref err) => err.description(),
RequestError::ParseError(ref err) => err.description(),
}
}
}
#[derive(Debug, PartialEq)]
pub enum ParseError {
XmlError(XmlError),
InvalidValue(String),
UnexpectedXml {
expected: String,
position: TextPosition,
}
}
impl From<XmlError> for ParseError {
fn from(e: XmlError) -> Self {
ParseError::XmlError(e)
}
}
impl From<io::Error> for ParseError {
fn from(e: io::Error) -> Self {
ParseError::XmlError(XmlError::from(e))
}
}
impl Display for ParseError {
fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
match *self {
ParseError::XmlError(ref err) => write!(fmt, "malformed XML: {}", err),
ParseError::InvalidValue(ref desc) => write!(fmt, "invalid value: {}", desc),
ParseError::UnexpectedXml {
ref expected,
ref position,
} => {
write!(fmt, "expected {} at {}", expected, position)
}
}
}
}
impl Error for ParseError {
fn description(&self) -> &str {
match *self {
ParseError::XmlError(ref err) => err.description(),
ParseError::InvalidValue(ref desc) => desc,
ParseError::UnexpectedXml { .. } => "unexpected XML content",
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct Fault {
pub fault_code: i32,
pub fault_string: String,
}
impl Fault {
pub fn from_value(value: &Value) -> Option<Self> {
match value {
&Value::Struct(ref map) => {
match (map.get("faultCode"), map.get("faultString")) {
(Some(&Value::Int(fault_code)), Some(&Value::String(ref fault_string))) => {
Some(Fault {
fault_code: fault_code,
fault_string: fault_string.to_string(),
})
}
_ => None
}
}
_ => None
}
}
}