use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum ColumnFlag {
Id,
Title,
Searchable,
Orderable,
Mandatory,
Hidden,
RequestParam,
Calculated,
Auto,
Other(String),
}
impl ColumnFlag {
pub fn as_str(&self) -> &str {
match self {
ColumnFlag::Id => "id",
ColumnFlag::Title => "title",
ColumnFlag::Searchable => "searchable",
ColumnFlag::Orderable => "orderable",
ColumnFlag::Mandatory => "mandatory",
ColumnFlag::Hidden => "hidden",
ColumnFlag::RequestParam => "request_param",
ColumnFlag::Calculated => "calculated",
ColumnFlag::Auto => "auto",
ColumnFlag::Other(name) => name,
}
}
}
impl PartialEq for ColumnFlag {
fn eq(&self, other: &Self) -> bool {
self.as_str() == other.as_str()
}
}
impl Eq for ColumnFlag {}
impl std::hash::Hash for ColumnFlag {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.as_str().hash(state)
}
}
impl From<&str> for ColumnFlag {
fn from(name: &str) -> Self {
match name {
"id" => ColumnFlag::Id,
"title" => ColumnFlag::Title,
"searchable" => ColumnFlag::Searchable,
"orderable" => ColumnFlag::Orderable,
"mandatory" => ColumnFlag::Mandatory,
"hidden" => ColumnFlag::Hidden,
"request_param" => ColumnFlag::RequestParam,
"calculated" => ColumnFlag::Calculated,
"auto" => ColumnFlag::Auto,
other => ColumnFlag::Other(other.to_string()),
}
}
}
impl From<String> for ColumnFlag {
fn from(name: String) -> Self {
ColumnFlag::from(name.as_str())
}
}
impl fmt::Display for ColumnFlag {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl Serialize for ColumnFlag {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for ColumnFlag {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
Ok(ColumnFlag::from(String::deserialize(deserializer)?))
}
}