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        match self {
51            Some(a) => a.extend_classes(classes),
52            None => {}
53        }
54    }
55}
56
57impl<T> AsClasses for Vec<T>
58where
59    T: AsClasses,
60{
61    fn extend_classes(&self, classes: &mut Classes) {
62        for i in self {
63            classes.extend(i.as_classes());
64        }
65    }
66}
67
68/// Allow extending a set of classes
69pub trait ExtendClasses<A: AsClasses> {
70    /// Extend a set of classes with a value implementing [`AsClasses`].
71    fn extend_from(&mut self, from: &A);
72}
73
74impl<A: AsClasses> ExtendClasses<A> for Classes {
75    fn extend_from(&mut self, from: &A) {
76        from.extend_classes(self)
77    }
78}