use crate::roads::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 = "InvalidArgument")]
InvalidArgument,
#[serde(alias = "PermissionDenied")]
PermissionDenied,
#[serde(alias = "NotFound")]
NotFound,
#[serde(alias = "ResourceExhausted")]
ResourceExhausted,
}
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::InvalidArgument => Self::from("INVALID_ARGUMENT"),
Status::PermissionDenied => Self::from("PERMISSION_DENIED"),
Status::NotFound => Self::from("NOT_FOUND"),
Status::ResourceExhausted => Self::from("RESOURCE_EXHAUSTED"),
} } }
static STATUSES_BY_CODE: phf::Map<&'static str, Status> = phf_map! {
"INVALID_ARGUMENT" => Status::InvalidArgument,
"PERMISSION_DENIED" => Status::PermissionDenied,
"NOT_FOUND" => Status::NotFound,
"RESOURCE_EXHAUSTED" => Status::ResourceExhausted,
};
impl std::convert::TryFrom<&str> for Status {
type Error = crate::roads::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::roads::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::InvalidArgument
} }
impl std::fmt::Display for Status {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::InvalidArgument => write!(f, "Invalid Argument"),
Self::PermissionDenied => write!(f, "Permission Denied"),
Self::NotFound => write!(f, "Not Found"),
Self::ResourceExhausted => write!(f, "Resource Exhausted"),
} } }