use crate::directions::error::Error;
use phf::phf_map;
use serde::{Deserialize, Deserializer, Serialize};
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
#[serde(rename_all(serialize = "SCREAMING_SNAKE_CASE", deserialize = "SCREAMING_SNAKE_CASE"))]
pub enum GeocoderStatus {
#[serde(alias = "Ok")]
Ok,
#[serde(alias = "ZeroResults")]
ZeroResults,
#[serde(alias = "UnknownError")]
UnknownError,
}
impl<'de> Deserialize<'de> for GeocoderStatus {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let string = String::deserialize(deserializer)?;
match Self::try_from(string.as_str()) {
Ok(variant) => Ok(variant),
Err(error) => Err(serde::de::Error::custom(error.to_string())),
} } }
impl std::convert::From<&GeocoderStatus> for String {
fn from(geocoder_status: &GeocoderStatus) -> Self {
match geocoder_status {
GeocoderStatus::Ok => Self::from("OK"),
GeocoderStatus::ZeroResults => Self::from("ZERO_RESULTS"),
GeocoderStatus::UnknownError => Self::from("UNKNOWN_ERROR"),
} } }
static GEOCODER_STATUSES_BY_CODE: phf::Map<&'static str, GeocoderStatus> = phf_map! {
"OK" => GeocoderStatus::Ok,
"ZERO_RESULTS" => GeocoderStatus::ZeroResults,
"UNKNOWN_ERROR" => GeocoderStatus::UnknownError,
};
impl std::convert::TryFrom<&str> for GeocoderStatus {
type Error = crate::directions::error::Error;
fn try_from(geocoder_status_code: &str) -> Result<Self, Self::Error> {
GEOCODER_STATUSES_BY_CODE
.get(geocoder_status_code)
.cloned()
.ok_or_else(|| Error::InvalidGeocoderStatusCode(geocoder_status_code.to_string()))
} }
impl std::str::FromStr for GeocoderStatus {
type Err = crate::directions::error::Error;
fn from_str(geocoder_status_code: &str) -> Result<Self, Self::Err> {
GEOCODER_STATUSES_BY_CODE
.get(geocoder_status_code)
.cloned()
.ok_or_else(|| Error::InvalidGeocoderStatusCode(geocoder_status_code.to_string()))
} }
impl std::default::Default for GeocoderStatus {
fn default() -> Self {
Self::Ok
} }
impl std::fmt::Display for GeocoderStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::Ok => write!(f, "OK"),
Self::ZeroResults => write!(f, "Zero Results"),
Self::UnknownError => write!(f, "Unknown Error"),
} } }