use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt;
use std::str::FromStr;
use schemars::JsonSchema;
#[cfg(feature = "typescript")]
use tsify::Tsify;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, JsonSchema)]
#[cfg_attr(feature = "typescript", derive(Tsify))]
#[cfg_attr(feature = "typescript", tsify(into_wasm_abi, from_wasm_abi))]
pub struct RoleName {
pub original: String,
pub lowercase: String,
}
impl RoleName {
pub fn new(name: &str) -> Self {
RoleName {
original: name.to_string(),
lowercase: name.to_lowercase(),
}
}
pub fn as_lowercase(&self) -> &str {
&self.lowercase
}
pub fn as_str(&self) -> &str {
&self.original
}
}
impl fmt::Display for RoleName {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.original)
}
}
impl FromStr for RoleName {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(RoleName::new(s))
}
}
impl From<&str> for RoleName {
fn from(s: &str) -> Self {
RoleName::new(s)
}
}
impl From<String> for RoleName {
fn from(s: String) -> Self {
RoleName::new(&s)
}
}
impl Serialize for RoleName {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&self.original)
}
}
impl<'de> Deserialize<'de> for RoleName {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
Ok(RoleName::new(&s))
}
}