rolodex/types/
geo.rs

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));