use crate::distance_matrix::error::Error;
use phf::phf_map;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[repr(u8)]
pub enum ElementStatus {
MaxRouteLengthExceeded = 0,
NotFound = 1,
#[default]
Ok = 2,
ZeroResults = 3,
}
impl<'de> Deserialize<'de> for ElementStatus {
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 Serialize for ElementStatus {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(std::convert::Into::<&str>::into(self))
} }
impl std::convert::From<&ElementStatus> for &str {
fn from(element_status: &ElementStatus) -> Self {
match element_status {
ElementStatus::MaxRouteLengthExceeded => "MAX_ROUTE_LENGTH_EXCEEDED",
ElementStatus::NotFound => "NOT_FOUND",
ElementStatus::Ok => "OK",
ElementStatus::ZeroResults => "ZERO_RESULTS",
} } }
impl std::fmt::Display for ElementStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", std::convert::Into::<&str>::into(self))
} }
impl std::convert::From<&ElementStatus> for String {
fn from(element_status: &ElementStatus) -> Self {
std::convert::Into::<&str>::into(element_status).to_string()
} }
static ELEMENT_STATUSES_BY_CODE: phf::Map<&'static str, ElementStatus> = phf_map! {
"MAX_ROUTE_LENGTH_EXCEEDED" => ElementStatus::MaxRouteLengthExceeded,
"NOT_FOUND" => ElementStatus::NotFound,
"OK" => ElementStatus::Ok,
"ZERO_RESULTS" => ElementStatus::ZeroResults,
};
impl std::convert::TryFrom<&str> for ElementStatus {
type Error = crate::distance_matrix::error::Error;
fn try_from(element_status_code: &str) -> Result<Self, Self::Error> {
ELEMENT_STATUSES_BY_CODE
.get(element_status_code)
.cloned()
.ok_or_else(|| Error::InvalidElementStatusCode(element_status_code.to_string()))
} }
impl std::str::FromStr for ElementStatus {
type Err = crate::distance_matrix::error::Error;
fn from_str(element_status_code: &str) -> Result<Self, Self::Err> {
ELEMENT_STATUSES_BY_CODE
.get(element_status_code)
.cloned()
.ok_or_else(|| Error::InvalidElementStatusCode(element_status_code.to_string()))
} }
impl ElementStatus {
#[must_use]
pub const fn display(&self) -> &str {
match self {
Self::MaxRouteLengthExceeded => "Maximum Route Length Exceeded",
Self::NotFound => "Not Found",
Self::Ok => "OK",
Self::ZeroResults => "Zero Results",
} } }