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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
mod common;
mod repr;

pub use self::repr::get_reflect_property_type;
use self::common::*;

use std::collections::HashMap;
use types::SharedUnit;
use eval::Expr;

/// Values for appearance styles properties
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Appearance {
    Background(Background),
    Transforms(Transforms),
    Filters(Filters),

    BorderRadius(BorderRadius),
    BorderColor(BorderColor),
    BorderStyle(BorderStyle),

    Auto,
}

/// Values for layout styles properties
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Layout {
    FlexDirection(FlexDirection),
    PositionType(PositionType),
    AspectRatio(AspectRatio),
    BorderWidth(BorderWidth),
    FlexShrink(FlexShrink),
    FlexFactor(FlexFactor),
    Overflow(Overflow),
    FlexGrow(FlexGrow),
    Display(Display),
    Justify(Justify),
    Align(Align),
    Wrap(Wrap),

    // Shared Unit
    SharedUnit(SharedUnit),
}

/// Values for union of appearance and layout
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum PropertyValue {
    Appearance(Appearance),
    Layout(Layout),
}

/// Link type for appearance `PropertiesStore`
pub type PropertiesApperance = PropertiesStore<Appearance>;
/// Link type for layout `PropertiesStore`
pub type PropertiesLayout = PropertiesStore<FlexStyle>;
/// Link type for calc expressions `PropertiesStore`
pub type PropertiesExpressions = PropertiesStore<Expr>;

/// Properties storage generic type
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PropertiesStore<T>(pub HashMap<String, T>);

/// All properties of styles of different types.
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct Properties {
    /// Runtime Layout Calc Expressions (returned value for StyleUnit)
    pub expressions: PropertiesExpressions,

    /// Appearance properties store
    pub appearance: PropertiesApperance,
    /// Layout properties store with yoga `FlexStyle`
    pub layout: PropertiesLayout,
}

/* _______________________Generic macro impl`s______________________ */
impl_union_property_conversion!(Appearance);
impl_union_property_conversion!(Layout);

/* ___________________Impl Traits & Conversions_____________________ */
impl<T> Default for PropertiesStore<T> {
    fn default() -> PropertiesStore<T> {
        PropertiesStore(HashMap::new())
    }
}