From 92dbb56564cfd9defdc9a655d0cda84af5c3ec64 Mon Sep 17 00:00:00 2001 From: Konstantin Zudov Date: Sat, 24 Feb 2018 00:15:05 +0200 Subject: [PATCH] Include the child tag name into 'InvalidChildElement' error. This makes the error much more useful. Including the actual name of a tag that caused problem makes it possible to figure out what's wrong with the gpx file without having to go through the library code finding out what did it expect. PR: https://github.com/georust/rust-gpx/pull/7 --- src/errors.rs | 4 ++-- src/parser/email.rs | 7 +++++-- src/parser/gpx.rs | 5 ++++- src/parser/link.rs | 5 ++++- src/parser/metadata.rs | 5 ++++- src/parser/person.rs | 5 ++++- src/parser/track.rs | 5 ++++- src/parser/tracksegment.rs | 5 ++++- src/parser/waypoint.rs | 5 ++++- 9 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/errors.rs b/src/errors.rs index c5dd85f..6c531b5 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -5,9 +5,9 @@ error_chain!{ errors { /// InvalidChildElement signifies when an element has a child that isn't /// valid per the GPX spec. - InvalidChildElement(parent: &'static str) { + InvalidChildElement(child: String, parent: &'static str) { description("invalid child element") - display("invalid child element in {}", String::from(*parent)) + display("invalid child element '{}' in {}", child, String::from(*parent)) } /// InvalidElementLacksAttribute signifies when an element is missing a diff --git a/src/parser/email.rs b/src/parser/email.rs index e16e45f..f9bd0ae 100644 --- a/src/parser/email.rs +++ b/src/parser/email.rs @@ -40,7 +40,10 @@ pub fn consume(reader: &mut Peekable>) -> Result { email = Some(format!("{id}@{domain}", id = id, domain = domain)); } - _ => Err(Error::from(ErrorKind::InvalidChildElement("email")))?, + child => Err(Error::from(ErrorKind::InvalidChildElement( + String::from(child), + "email", + )))?, } } @@ -117,7 +120,7 @@ mod tests { let err = consume!("").unwrap_err(); assert_eq!(err.description(), "invalid child element"); - assert_eq!(err.to_string(), "invalid child element in email"); + assert_eq!(err.to_string(), "invalid child element 'child' in email"); } #[test] diff --git a/src/parser/gpx.rs b/src/parser/gpx.rs index 8d4b4a1..6be6153 100644 --- a/src/parser/gpx.rs +++ b/src/parser/gpx.rs @@ -37,7 +37,10 @@ pub fn consume(reader: &mut Peekable>) -> Result { "trk" => Ok(ParseEvent::StartTrack), "wpt" => Ok(ParseEvent::StartWaypoint), "gpx" => Ok(ParseEvent::Ignore), - _ => Err(Error::from(ErrorKind::InvalidChildElement("gpx")))?, + child => Err(Error::from(ErrorKind::InvalidChildElement( + String::from(child), + "gpx", + )))?, } } diff --git a/src/parser/link.rs b/src/parser/link.rs index 7a2f2ab..1ea2941 100644 --- a/src/parser/link.rs +++ b/src/parser/link.rs @@ -35,7 +35,10 @@ pub fn consume(reader: &mut Peekable>) -> Result { link.href = attr.value; } - _ => Err(Error::from(ErrorKind::InvalidChildElement("link")))?, + child => Err(Error::from(ErrorKind::InvalidChildElement( + String::from(child), + "link", + )))?, } } diff --git a/src/parser/metadata.rs b/src/parser/metadata.rs index 164b42a..1e1076d 100644 --- a/src/parser/metadata.rs +++ b/src/parser/metadata.rs @@ -43,7 +43,10 @@ pub fn consume(reader: &mut Peekable>) -> Result { "keywords" => Ok(ParseEvent::StartKeywords), "time" => Ok(ParseEvent::StartTime), "link" => Ok(ParseEvent::StartLink), - _ => Err(Error::from(ErrorKind::InvalidChildElement("metadata")))?, + child => Err(Error::from(ErrorKind::InvalidChildElement( + String::from(child), + "metadata", + )))?, } } diff --git a/src/parser/person.rs b/src/parser/person.rs index a525f20..6efaccf 100644 --- a/src/parser/person.rs +++ b/src/parser/person.rs @@ -37,7 +37,10 @@ pub fn consume(reader: &mut Peekable>) -> Result { "link" => Ok(ParseEvent::StartLink), "person" => Ok(ParseEvent::Ignore), "author" => Ok(ParseEvent::Ignore), - _ => Err(Error::from(ErrorKind::InvalidChildElement("person"))), + child => Err(Error::from(ErrorKind::InvalidChildElement( + String::from(child), + "person", + ))), } } diff --git a/src/parser/track.rs b/src/parser/track.rs index 13dcc41..7e83e04 100644 --- a/src/parser/track.rs +++ b/src/parser/track.rs @@ -25,7 +25,10 @@ pub fn consume(reader: &mut Peekable>) -> Result { "src" => track.source = Some(string::consume(reader)?), "type" => track._type = Some(string::consume(reader)?), "trkseg" => track.segments.push(tracksegment::consume(reader)?), - _ => Err(Error::from(ErrorKind::InvalidChildElement("track")))?, + child => Err(Error::from(ErrorKind::InvalidChildElement( + String::from(child), + "track", + )))?, }, XmlEvent::EndElement { .. } => { diff --git a/src/parser/tracksegment.rs b/src/parser/tracksegment.rs index 1cc78b0..71fe43f 100644 --- a/src/parser/tracksegment.rs +++ b/src/parser/tracksegment.rs @@ -32,7 +32,10 @@ pub fn consume(reader: &mut Peekable>) -> Result Ok(TrackSegmentEvent::StartTrkSeg), "trkpt" => Ok(TrackSegmentEvent::StartTrkPt), - _ => Err(Error::from(ErrorKind::InvalidChildElement("tracksegment"))), + child => Err(Error::from(ErrorKind::InvalidChildElement( + String::from(child), + "tracksegment", + ))), } } diff --git a/src/parser/waypoint.rs b/src/parser/waypoint.rs index 9049425..131b6eb 100644 --- a/src/parser/waypoint.rs +++ b/src/parser/waypoint.rs @@ -123,7 +123,10 @@ pub fn consume(reader: &mut Peekable>) -> Result { // Finally the GPX 1.1 extensions "extensions" => extensions::consume(reader)?, - _ => Err(Error::from(ErrorKind::InvalidChildElement("waypoint")))?, + child => Err(Error::from(ErrorKind::InvalidChildElement( + String::from(child), + "waypoint", + )))?, } }