Skip to main content

patternfly_yew/core/
classes.rs

1use yew::Classes;
2
3/// Represent a value as CSS classes
4///
5/// Many variants and options need to be represented as CSS classes when rendering. This trait
6/// provides a common way to turn some variant, value, enum into a set of classes.
7///
8/// In combination with [`ExtendClasses::extend_from`], this create a convenient way to
9/// assemble a list of classes when rendering.
10pub trait AsClasses {
11    fn as_classes(&self) -> Classes {
12        let mut classes = Classes::new();
13        self.extend_classes(&mut classes);
14        classes
15    }
16
17    fn extend_classes(&self, classes: &mut Classes);
18}
19
20impl AsClasses for String {
21    fn extend_classes(&self, classes: &mut Classes) {
22        classes.push(self)
23    }
24}
25
26impl AsClasses for &str {
27    fn extend_classes(&self, classes: &mut Classes) {
28        classes.push(self.to_string())
29    }
30}
31
32impl AsClasses for u16 {
33    fn extend_classes(&self, classes: &mut Classes) {
34        classes.push(self.to_string())
35    }
36}
37
38impl AsClasses for dyn ToString {
39    fn as_classes(&self) -> Classes {
40        Classes::from(self.to_string())
41    }
42
43    fn extend_classes(&self, classes: &mut Classes) {
44        classes.extend(Classes::from(self.to_string()))
45    }
46}
47
48impl<T: AsClasses> AsClasses for Option<T> {
49    fn extend_classes(&self, classes: &mut Classes) {
50        if let Some(a) = self {
51            a.extend_classes(classes)
52        }
53    }
54}
55
56impl<T> AsClasses for Vec<T>
57where
58    T: AsClasses,
59{
60    fn extend_classes(&self, classes: &mut Classes) {
61        for i in self {
62            classes.extend(i.as_classes());
63        }
64    }
65}
66
67/// Allow extending a set of classes
68pub trait ExtendClasses<A: AsClasses> {
69    /// Extend a set of classes with a value implementing [`AsClasses`].
70    fn extend_from(&mut self, from: &A);
71}
72
73impl<A: AsClasses> ExtendClasses<A> for Classes {
74    fn extend_from(&mut self, from: &A) {
75        from.extend_classes(self)
76    }
77}