use crate::places::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 Status {
#[serde(alias = "Ok")]
Ok,
#[serde(alias = "ZeroResults")]
ZeroResults,
#[serde(alias = "InvalidRequest")]
InvalidRequest,
#[serde(alias = "OverQueryLimit")]
OverQueryLimit,
#[serde(alias = "RequestDenied")]
RequestDenied,
#[serde(alias = "UnknownError")]
UnknownError,
#[serde(alias = "NotFound")]
NotFound,
}
impl<'de> Deserialize<'de> for Status {
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<&Status> for String {
fn from(status: &Status) -> Self {
match status {
Status::InvalidRequest => Self::from("INVALID_REQUEST"),
Status::Ok => Self::from("OK"),
Status::OverQueryLimit => Self::from("OVER_QUERY_LIMIT"),
Status::RequestDenied => Self::from("REQUEST_DENIED"),
Status::UnknownError => Self::from("UNKNOWN_ERROR"),
Status::ZeroResults => Self::from("ZERO_RESULTS"),
Status::NotFound => Self::from("NOT_FOUND"),
} } }
static STATUSES_BY_CODE: phf::Map<&'static str, Status> = phf_map! {
"INVALID_REQUEST" => Status::InvalidRequest,
"OK" => Status::Ok,
"OVER_QUERY_LIMIT" => Status::OverQueryLimit,
"REQUEST_DENIED" => Status::RequestDenied,
"UNKNOWN_ERROR" => Status::UnknownError,
"ZERO_RESULTS" => Status::ZeroResults,
"NOT_FOUND" => Status::NotFound,
};
impl std::convert::TryFrom<&str> for Status {
type Error = crate::places::error::Error;
fn try_from(status_code: &str) -> Result<Self, Self::Error> {
STATUSES_BY_CODE
.get(status_code)
.cloned()
.ok_or_else(|| Error::InvalidStatusCode(status_code.to_string()))
} }
impl std::str::FromStr for Status {
type Err = crate::places::error::Error;
fn from_str(status_code: &str) -> Result<Self, Self::Err> {
STATUSES_BY_CODE
.get(status_code)
.cloned()
.ok_or_else(|| Error::InvalidStatusCode(status_code.to_string()))
} }
impl std::default::Default for Status {
fn default() -> Self {
Self::Ok
} }
impl std::fmt::Display for Status {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::InvalidRequest => write!(f, "Invalid Request"),
Self::Ok => write!(f, "OK"),
Self::OverQueryLimit => write!(f, "Over Query Limit"),
Self::RequestDenied => write!(f, "Request Denied"),
Self::UnknownError => write!(f, "Unknown Error"),
Self::ZeroResults => write!(f, "Zero Results"),
Self::NotFound => write!(f, "Not Found"),
} } }