use std::fmt;
use dioxus_core::{IntoAttributeValue, AttributeValue};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CssClass {
Static(&'static str),
Dynamic(Vec<String>),
}
impl CssClass {
pub const fn new(class: &'static str) -> Self {
CssClass::Static(class)
}
}
impl IntoAttributeValue for CssClass {
fn into_value(self) -> AttributeValue {
AttributeValue::Text(self.to_string())
}
}
impl fmt::Display for CssClass {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Static(s) => write!(f, "{}", s),
Self::Dynamic(classes) => write!(f, "{}", classes.join(" ")),
}
}
}
impl From<&str> for CssClass {
fn from(s: &str) -> Self {
CssClass::Dynamic(vec![s.to_string()])
}
}
impl From<String> for CssClass {
fn from(s: String) -> Self {
CssClass::Dynamic(vec![s])
}
}
impl std::ops::Add for CssClass {
type Output = CssClass;
fn add(self, other: CssClass) -> CssClass {
match (self, other) {
(Self::Static(s1), Self::Static(s2)) => {
CssClass::Dynamic(vec![s1.to_string(), s2.to_string()])
}
(Self::Static(s1), Self::Dynamic(mut v2)) => {
let mut v = vec![s1.to_string()];
v.append(&mut v2);
CssClass::Dynamic(v)
}
(Self::Dynamic(mut v1), Self::Static(s2)) => {
v1.push(s2.to_string());
CssClass::Dynamic(v1)
}
(Self::Dynamic(mut v1), Self::Dynamic(mut v2)) => {
v1.append(&mut v2);
CssClass::Dynamic(v1)
}
}
}
}
impl std::ops::Add for &CssClass {
type Output = CssClass;
fn add(self, other: &CssClass) -> CssClass {
self.clone() + other.clone()
}
}