vertigo/dom/
attr_value.rs

1use std::rc::Rc;
2
3use crate::{Computed, Css, Value};
4
5#[derive(Clone)]
6pub enum AttrValue {
7    String(Rc<String>),
8    Computed(Computed<String>),
9    ComputedOpt(Computed<Option<String>>),
10    Value(Value<String>),
11    ValueOpt(Value<Option<String>>),
12}
13
14impl<K: ToString> From<K> for AttrValue {
15    fn from(value: K) -> Self {
16        AttrValue::String(Rc::new(value.to_string()))
17    }
18}
19
20macro_rules! impl_from_computed_for_attrvalue {
21    ($typename:ty, $variant:ident, |$var:ident| $body:expr) => {
22        impl From<$typename> for AttrValue {
23            fn from($var: $typename) -> Self {
24                AttrValue::$variant($body)
25            }
26        }
27    };
28    ($typename: ty, $variant: ident) => {
29        impl_from_computed_for_attrvalue!($typename, $variant, |v| v);
30    };
31}
32
33impl_from_computed_for_attrvalue!(Computed<String>, Computed);
34impl_from_computed_for_attrvalue!(Computed<Option<String>>, ComputedOpt);
35impl_from_computed_for_attrvalue!(&Computed<String>, Computed, |v| v.clone());
36impl_from_computed_for_attrvalue!(&Computed<Option<String>>, ComputedOpt, |v| v.clone());
37
38impl_from_computed_for_attrvalue!(Value<String>, Value);
39impl_from_computed_for_attrvalue!(Value<Option<String>>, ValueOpt);
40impl_from_computed_for_attrvalue!(&Value<String>, Value, |v| v.clone());
41impl_from_computed_for_attrvalue!(&Value<Option<String>>, ValueOpt, |v| v.clone());
42
43macro_rules! impl_stringable_into_computed_for_attrvalue {
44    ($typename:ty) => {
45        impl_from_computed_for_attrvalue!(Computed<$typename>, Computed, |v| v
46            .map(|v| v.to_string()));
47        impl_from_computed_for_attrvalue!(&Computed<$typename>, Computed, |v| v
48            .map(|v| v.to_string()));
49        impl_from_computed_for_attrvalue!(Value<$typename>, Computed, |v| v
50            .to_computed()
51            .map(|v| v.to_string()));
52        impl_from_computed_for_attrvalue!(&Value<$typename>, Computed, |v| v
53            .to_computed()
54            .map(|v| v.to_string()));
55    };
56}
57
58impl_stringable_into_computed_for_attrvalue!(i8);
59impl_stringable_into_computed_for_attrvalue!(i16);
60impl_stringable_into_computed_for_attrvalue!(i32);
61impl_stringable_into_computed_for_attrvalue!(i64);
62impl_stringable_into_computed_for_attrvalue!(isize);
63
64impl_stringable_into_computed_for_attrvalue!(u8);
65impl_stringable_into_computed_for_attrvalue!(u16);
66impl_stringable_into_computed_for_attrvalue!(u32);
67impl_stringable_into_computed_for_attrvalue!(u64);
68impl_stringable_into_computed_for_attrvalue!(usize);
69
70impl_stringable_into_computed_for_attrvalue!(f32);
71impl_stringable_into_computed_for_attrvalue!(f64);
72
73impl_stringable_into_computed_for_attrvalue!(char);
74
75impl_stringable_into_computed_for_attrvalue!(bool);
76
77pub enum CssAttrValue {
78    Css(Css),
79    Computed(Computed<Css>),
80}
81
82impl From<Css> for CssAttrValue {
83    fn from(value: Css) -> Self {
84        CssAttrValue::Css(value)
85    }
86}
87
88impl From<Computed<Css>> for CssAttrValue {
89    fn from(value: Computed<Css>) -> Self {
90        CssAttrValue::Computed(value)
91    }
92}
93
94impl From<&Css> for CssAttrValue {
95    fn from(value: &Css) -> Self {
96        CssAttrValue::Css(value.clone())
97    }
98}