1use nom::{do_parse, named, parse_to, tag, IResult};
2
3use std::fmt;
4
5use crate::{Parse, ParseError};
6
7#[derive(Debug, PartialEq, Clone)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub struct GeoPosition(pub f64, pub f64);
10
11impl fmt::Display for GeoPosition {
12 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
13 write!(f, "{}, {}", self.0, self.1)
14 }
15}
16
17impl<'a> Parse<'a> for GeoPosition {
18 fn parse(input: &str) -> IResult<&str, GeoPosition, ParseError> {
19 parse_geo_position(input).map_err(|c| match c {
20 nom::Err::Error(err) => nom::Err::Error(crate::parse::to_parse_error(input, err)),
21 nom::Err::Failure(err) => nom::Err::Failure(crate::parse::to_parse_error(input, err)),
22 nom::Err::Incomplete(n) => nom::Err::Incomplete(n),
23 })
24 }
25}
26
27named!(parse_geo_position<&str, GeoPosition>, do_parse!(
28 x: parse_to!(f64) >>
29 tag!(",") >>
30 y: parse_to!(f64) >>
31 (GeoPosition(x, y))
32));