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