use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum FieldRole {
Primary,
Secondary,
Badge,
Timestamp,
DetailOnly,
Hidden,
}
impl FieldRole {
pub fn shows_in_list(self) -> bool {
!matches!(self, FieldRole::DetailOnly | FieldRole::Hidden)
}
pub fn reaches_template(self) -> bool {
self != FieldRole::Hidden
}
pub fn slug(self) -> &'static str {
match self {
FieldRole::Primary => "primary",
FieldRole::Secondary => "secondary",
FieldRole::Badge => "badge",
FieldRole::Timestamp => "timestamp",
FieldRole::DetailOnly => "detail_only",
FieldRole::Hidden => "hidden",
}
}
pub fn from_slug(slug: &str) -> Option<Self> {
match slug {
"primary" => Some(FieldRole::Primary),
"secondary" => Some(FieldRole::Secondary),
"badge" => Some(FieldRole::Badge),
"timestamp" => Some(FieldRole::Timestamp),
"detail_only" => Some(FieldRole::DetailOnly),
"hidden" => Some(FieldRole::Hidden),
_ => None,
}
}
pub fn all() -> &'static [FieldRole] {
&[
FieldRole::Primary,
FieldRole::Secondary,
FieldRole::Badge,
FieldRole::Timestamp,
FieldRole::DetailOnly,
FieldRole::Hidden,
]
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SemanticClass {
#[default]
Neutral,
Info,
Success,
Warning,
Danger,
}
impl SemanticClass {
pub fn css_suffix(self) -> &'static str {
match self {
SemanticClass::Neutral => "neutral",
SemanticClass::Info => "info",
SemanticClass::Success => "success",
SemanticClass::Warning => "warning",
SemanticClass::Danger => "danger",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn role_slug_roundtrips_for_every_variant() {
for role in FieldRole::all() {
assert_eq!(FieldRole::from_slug(role.slug()), Some(*role));
}
}
#[test]
fn role_slug_matches_serde_repr() {
for role in FieldRole::all() {
let json = serde_json::to_string(role).unwrap();
assert_eq!(json, format!("\"{}\"", role.slug()));
}
}
#[test]
fn unknown_role_slug_is_none() {
assert_eq!(FieldRole::from_slug("nope"), None);
}
}