1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
pub mod components;
pub mod custom_animated_show;
pub mod items;

pub trait Style {
    fn style(&self) -> String;
}

impl Style for String {
    fn style(&self) -> String {
        self.to_string()
    }
}

impl Style for Option<String> {
    fn style(&self) -> String {
        self.as_ref().map(|s| s.style()).unwrap_or_default()
    }
}

impl Style for &str {
    fn style(&self) -> String {
        self.to_string()
    }
}

#[macro_export]
macro_rules! cn {
    ($($styles: expr),*) => {
        {
            use $crate::Style;
            let mut result = String::new();
            $(
                result.push_str(" ");
                result.push_str(&$styles.style());
            )*
            result
        }
    };
}