use serde::{Deserialize, Serialize};
use std::fmt;
use std::str::FromStr;
use crate::errors::ParseEnumError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum UserRole {
Admin,
User,
Anonymous,
}
impl UserRole {
pub const fn as_str(&self) -> &'static str {
match self {
Self::Admin => "admin",
Self::User => "user",
Self::Anonymous => "anonymous",
}
}
}
impl fmt::Display for UserRole {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl FromStr for UserRole {
type Err = ParseEnumError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"admin" => Ok(Self::Admin),
"user" => Ok(Self::User),
"anonymous" => Ok(Self::Anonymous),
_ => Err(ParseEnumError::new("user_role", s)),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum UserStatus {
Active,
Inactive,
Suspended,
Pending,
Deleted,
Temporary,
}
impl UserStatus {
pub const fn as_str(&self) -> &'static str {
match self {
Self::Active => "active",
Self::Inactive => "inactive",
Self::Suspended => "suspended",
Self::Pending => "pending",
Self::Deleted => "deleted",
Self::Temporary => "temporary",
}
}
pub const fn is_active(&self) -> bool {
matches!(self, Self::Active)
}
}
impl fmt::Display for UserStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl FromStr for UserStatus {
type Err = ParseEnumError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"active" => Ok(Self::Active),
"inactive" => Ok(Self::Inactive),
"suspended" => Ok(Self::Suspended),
"pending" => Ok(Self::Pending),
"deleted" => Ok(Self::Deleted),
"temporary" => Ok(Self::Temporary),
_ => Err(ParseEnumError::new("user_status", s)),
}
}
}