use crate::types::LatLng;
use rust_decimal_macros::dec;
#[cfg(not(feature = "geo"))]
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, serde::Serialize, serde::Deserialize)]
pub enum Locations {
LatLngs(Vec<LatLng>),
Polyline(String),
}
#[cfg(not(feature = "geo"))]
impl std::convert::From<&Locations> for String {
fn from(locations: &Locations) -> Self {
match locations {
Locations::LatLngs(latlngs) =>
latlngs.iter()
.map(String::from)
.collect::<Vec<String>>()
.join("|"),
Locations::Polyline(polyline) =>
format!("enc:{}", polyline),
} } }
#[cfg(feature = "geo")]
#[derive(Clone, Debug, PartialEq)]
pub enum Locations {
LatLngs(Vec<LatLng>),
Polyline(String),
MultiPoint(geo_types::geometry::MultiPoint),
Line(geo_types::geometry::Line),
LineString(geo_types::geometry::LineString),
}
#[cfg(feature = "geo")]
impl std::convert::From<&Locations> for String {
fn from(locations: &Locations) -> Self {
match locations {
Locations::LatLngs(latlngs) =>
latlngs.iter()
.map(String::from)
.collect::<Vec<String>>()
.join("|"),
Locations::Polyline(polyline) =>
format!("enc:{}", polyline),
Locations::MultiPoint(multi_point) =>
multi_point
.iter()
.map(|point|
format!("{lat},{lng}", lat=point.y(), lng=point.x())
) .collect::<Vec<String>>()
.join("|"),
Locations::Line(line) =>
format!(
"{start_lat},{start_lng}|{end_lat},{end_lng}",
start_lat=line.start.y,
start_lng=line.start.x,
end_lat=line.start.y,
end_lng=line.start.x,
),
Locations::LineString(line_string) =>
line_string
.coords()
.map(|coordinate|
format!("{lat},{lng}", lat=coordinate.y, lng=coordinate.x)
) .collect::<Vec<String>>()
.join("|"),
} } }
impl std::default::Default for Locations {
fn default() -> Self {
Locations::LatLngs(vec![LatLng::try_from_dec(dec!(0.0), dec!(0.0)).unwrap()])
} }
impl Locations {
pub fn from_polyline(polyline: impl Into<String>) -> Self {
Self::Polyline(polyline.into())
} }