1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
extern crate xml; use std::num::{ParseFloatError, ParseIntError}; #[derive(Debug)] pub enum Error { BoundsMissing(ErrorReason), MalformedTag(ErrorReason), MalformedNode(ErrorReason), MalformedWay(ErrorReason), MalformedRelation(ErrorReason), UnknownElement, XmlParseError(xml::reader::Error), } use std::fmt; #[derive(Debug)] pub enum ErrorReason { ParseFloat(ParseFloatError), ParseInt(ParseIntError), IllegalNesting, Missing, } impl From<ParseFloatError> for ErrorReason { fn from(err: ParseFloatError) -> ErrorReason { ErrorReason::ParseFloat(err) } } impl From<ParseIntError> for ErrorReason { fn from(err: ParseIntError) -> ErrorReason { ErrorReason::ParseInt(err) } } impl From<xml::reader::Error> for Error { fn from(err: xml::reader::Error) -> Error { Error::XmlParseError(err) } } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { use Error::*; match *self { BoundsMissing(ref reason) => write!(f, "OSM XML error: Missing bounds: {:?}", reason), MalformedTag(ref reason) => write!(f, "OSM XML error: Malformed tag: {:?}", reason), MalformedNode(ref reason) => write!(f, "OSM XML error: Malformed node: {:?}", reason), MalformedWay(ref reason) => write!(f, "OSM XML error: Malformed way: {:?}", reason), MalformedRelation(ref reason) => write!(f, "OSM XML error: Malformed relation: {:?}", reason), UnknownElement => write!(f, "OSM XML error: Unknown XML element"), XmlParseError(ref reason) => write!(f, "OSM XML parse error: {}", reason), } } } impl ::std::error::Error for Error { fn description(&self) -> &str { "OSM XML error" } fn cause(&self) -> Option<&::std::error::Error> { None } }