use crate::class::ClassName;
pub trait HasClasses {
fn classes(&self) -> &crate::class::Classes;
fn classes_mut(&mut self) -> &mut crate::class::Classes;
#[inline]
fn has_class(&self, class: &str) -> bool {
self.classes()
.iter()
.any(|existing| existing.as_str() == class)
}
#[inline]
fn add_class(&mut self, class: impl Into<ClassName>) -> &mut Self
where
Self: Sized,
{
self.classes_mut().add_if(class.into(), true);
self
}
#[inline]
fn set_class(&mut self, class: impl Into<ClassName>, present: bool) -> &mut Self
where
Self: Sized,
{
self.classes_mut().set(class.into(), present);
self
}
#[inline]
fn remove_class(&mut self, class: impl Into<ClassName>) -> &mut Self
where
Self: Sized,
{
self.classes_mut().set(class.into(), false);
self
}
#[inline]
fn with_class(mut self, class: impl Into<ClassName>) -> Self
where
Self: Sized,
{
self.classes_mut().add_if(class.into(), true);
self
}
#[inline]
fn add_classes(&mut self, classes: crate::class::Classes) -> &mut Self {
self.classes_mut().extend(classes);
self
}
#[inline]
fn with_classes(mut self, classes: crate::class::Classes) -> Self
where
Self: Sized,
{
self.classes_mut().extend(classes);
self
}
#[inline]
fn add_class_if(&mut self, class: impl Into<ClassName>, condition: bool) -> &mut Self
where
Self: Sized,
{
self.classes_mut().add_if(class.into(), condition);
self
}
#[inline]
fn with_class_if(mut self, class: impl Into<ClassName>, condition: bool) -> Self
where
Self: Sized,
{
self.classes_mut().add_if(class.into(), condition);
self
}
#[inline]
fn iter_classes(&self) -> core::slice::Iter<'_, ClassName> {
self.classes().iter()
}
#[inline]
fn classes_as_slice(&self) -> &[ClassName] {
self.classes().as_slice()
}
}
#[cfg(test)]
mod tests {
use crate::class::{Classes, HasClasses as _};
#[test]
fn setting_a_class_moves_it_to_end() {
let mut classes = Classes::default();
classes.add_class("first");
classes.add_class("updated");
classes.add_class("second");
classes.set_class("updated", true);
assert_eq!(classes.as_slice(), ["first", "second", "updated"]);
}
#[test]
fn adding_a_class_twice_moves_it_to_end() {
let mut classes = Classes::default();
classes.add_class("first");
classes.add_class("updated");
classes.add_class("second");
classes.add_class("updated");
assert_eq!(classes.as_slice(), ["first", "second", "updated"]);
}
}