Skip to main content

stylex_transform/shared/structures/
pre_rule_set.rs

1use stylex_macros::stylex_panic;
2
3use crate::shared::structures::pre_rule::{CompiledResult, ComputedStyle};
4use stylex_constants::constants::messages::RULE_SET_EMPTY;
5
6use super::{
7  null_pre_rule::NullPreRule,
8  pre_rule::{PreRule, PreRuleValue, PreRules},
9  state_manager::StateManager,
10};
11#[derive(Debug, Clone, PartialEq)]
12pub(crate) struct PreRuleSet {
13  rules: Vec<PreRules>,
14}
15
16impl PreRuleSet {
17  pub(crate) fn _new() -> Self {
18    PreRuleSet { rules: vec![] }
19  }
20  pub(crate) fn create(rules: Vec<PreRules>) -> PreRules {
21    let flat_rules = rules
22      .into_iter()
23      .flat_map(|rule| match rule {
24        PreRules::PreRuleSet(rule_set) => rule_set.rules,
25        _ => vec![rule],
26      })
27      .collect::<Vec<PreRules>>();
28
29    match flat_rules.len() {
30      0 => PreRules::NullPreRule(NullPreRule::new()),
31      1 => match flat_rules.first() {
32        Some(rule) => rule.to_owned(),
33        None => stylex_panic!("{}", RULE_SET_EMPTY),
34      },
35      _ => PreRules::PreRuleSet(PreRuleSet { rules: flat_rules }),
36    }
37  }
38}
39
40impl PreRule for PreRuleSet {
41  fn equals(&self, _other: &dyn PreRule) -> bool {
42    true
43  }
44  fn compiled(&mut self, state: &mut StateManager) -> CompiledResult {
45    let style_tuple = self
46      .rules
47      .iter_mut()
48      .flat_map(|rule| {
49        let compiled_rule = match rule {
50          PreRules::PreRuleSet(rule_set) => rule_set.compiled(state),
51          PreRules::StylesPreRule(styles_pre_rule) => styles_pre_rule.compiled(state),
52          PreRules::NullPreRule(null_pre_rule) => null_pre_rule.compiled(state),
53        };
54
55        match compiled_rule {
56          CompiledResult::ComputedStyles(styles) => styles,
57          _ => vec![],
58        }
59      })
60      .collect::<Vec<ComputedStyle>>();
61
62    CompiledResult::ComputedStyles(style_tuple)
63  }
64  fn get_value(&self) -> Option<PreRuleValue> {
65    let rule = match self.rules.first() {
66      Some(r) => r,
67      None => stylex_panic!("{}", RULE_SET_EMPTY),
68    };
69
70    match &rule {
71      PreRules::PreRuleSet(rule_set) => rule_set.get_value(),
72      PreRules::StylesPreRule(styles_pre_rule) => styles_pre_rule.get_value(),
73      PreRules::NullPreRule(null_pre_rule) => null_pre_rule.get_value(),
74    }
75  }
76}