use serde::{Deserialize, Serialize};
use std::{
fmt::{Display, Formatter, Result as FmtResult},
str::FromStr,
};
use utoipa::ToSchema;
#[derive(Debug, Clone, Deserialize, Serialize, ToSchema, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum SystemActor {
Beginner,
SubscriptionsManager,
UsersManager,
AccountManager,
GuestsManager,
GatewayManager,
SystemManager,
TenantOwner,
TenantManager,
Service,
#[serde(untagged)]
CustomRole(String),
}
impl Display for SystemActor {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
match self {
SystemActor::CustomRole(role) => write!(f, "{}", role),
SystemActor::Beginner => write!(f, "beginners"),
SystemActor::SubscriptionsManager => {
write!(f, "subscriptions-manager")
}
SystemActor::UsersManager => {
write!(f, "users-manager")
}
SystemActor::AccountManager => {
write!(f, "accounts-manager")
}
SystemActor::GuestsManager => {
write!(f, "guests-manager")
}
SystemActor::GatewayManager => {
write!(f, "gateway-manager")
}
SystemActor::SystemManager => write!(f, "system-manager"),
SystemActor::TenantOwner => write!(f, "tenant-owner"),
SystemActor::TenantManager => write!(f, "tenant-manager"),
SystemActor::Service => write!(f, "service"),
}
}
}
impl FromStr for SystemActor {
type Err = ();
fn from_str(s: &str) -> Result<SystemActor, ()> {
match s {
"beginners" | "beginner" | "no-role" => Ok(SystemActor::Beginner),
"subscriptions-account-manager" | "subscriptions-manager" => {
Ok(SystemActor::SubscriptionsManager)
}
"users-account-manager" | "users-manager" => {
Ok(SystemActor::UsersManager)
}
"accounts-manager" | "account-manager" => {
Ok(SystemActor::AccountManager)
}
"guests-manager" | "guest-manager" => {
Ok(SystemActor::GuestsManager)
}
"gateway-manager" => Ok(SystemActor::GatewayManager),
"system-manager" => Ok(SystemActor::SystemManager),
"tenant-manager" => Ok(SystemActor::TenantManager),
"tenant-owner" => Ok(SystemActor::TenantOwner),
"service" => Ok(SystemActor::Service),
other => Ok(SystemActor::CustomRole(other.to_string())),
}
}
}
impl SystemActor {
pub fn str(&self) -> &str {
match self {
SystemActor::CustomRole(role) => role,
SystemActor::Beginner => "beginners",
SystemActor::SubscriptionsManager => "subscriptions-manager",
SystemActor::UsersManager => "users-manager",
SystemActor::AccountManager => "accounts-manager",
SystemActor::GuestsManager => "guests-manager",
SystemActor::GatewayManager => "gateway-manager",
SystemActor::SystemManager => "system-manager",
SystemActor::TenantOwner => "tenant-owner",
SystemActor::TenantManager => "tenant-manager",
SystemActor::Service => "service",
}
}
}