use nom::{do_parse, named, parse_to, tag, IResult}; use std::fmt; use crate::{Parse, ParseError}; #[derive(Debug, PartialEq, Clone)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct GeoPosition(pub f64, pub f64); impl fmt::Display for GeoPosition { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}, {}", self.0, self.1) } } impl<'a> Parse<'a> for GeoPosition { fn parse(input: &str) -> IResult<&str, GeoPosition, ParseError> { parse_geo_position(input).map_err(|c| match c { nom::Err::Error(err) => nom::Err::Error(crate::parse::to_parse_error(input, err)), nom::Err::Failure(err) => nom::Err::Failure(crate::parse::to_parse_error(input, err)), nom::Err::Incomplete(n) => nom::Err::Incomplete(n), }) } } named!(parse_geo_position<&str, GeoPosition>, do_parse!( x: parse_to!(f64) >> tag!(",") >> y: parse_to!(f64) >> (GeoPosition(x, y)) ));