#[cfg(feature = "geo")]
mod geo;
use crate::types::LatLng;
use rust_decimal_macros::dec;
const NULL_ISLAND: LatLng = LatLng {
lat: dec!(0.0),
lng: dec!(0.0),
};
#[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(Self::from)
.collect::<Vec<Self>>()
.join("|"),
Locations::Polyline(polyline) => format!("enc:{polyline}"),
} } }
#[cfg(feature = "geo")]
#[derive(Clone, Debug, PartialEq)]
pub enum Locations {
LatLngs(Vec<LatLng>),
Polyline(String),
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(Self::from)
.collect::<Vec<Self>>()
.join("|"),
Locations::Polyline(polyline) => format!("enc:{polyline}"),
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<Self>>()
.join("|"),
} } }
impl std::default::Default for Locations {
fn default() -> Self {
Self::LatLngs(vec![NULL_ISLAND])
} }
impl Locations {
pub fn from_polyline(polyline: impl Into<String>) -> Self {
Self::Polyline(polyline.into())
} }