1pub mod traits;
2pub mod base;
3pub mod select;
4pub mod media_query;
5
6pub use traits::*;
7pub use base::*;
8pub use select::*;
9pub use media_query::*;
10
11use pest::iterators::Pairs;
12use crate::parser::Rule;
13use crate::utils::get_variable;
14
15#[derive(Debug)]
16pub struct Selects {
17 pub children: Vec<Select>, pub media_queries: Vec<MediaQuery>, pub variables: Vec<Variable>, }
21
22impl Selects {
23 pub fn new(pairs: Pairs<Rule>) -> Self {
24 let mut children = vec![]; let mut media_queries = vec![]; let mut variables = vec![]; let mut ancestor_variable_list = vec![]; println!("{}",pairs.len()); for pair in pairs {
31 if pair.as_rule() == Rule::selects {
32 for pair in pair.into_inner() {
33 match pair.as_rule() {
34 Rule::variable => {
35 let var = get_variable(pair); variables.push(var.clone()); ancestor_variable_list.insert(0, var); }
39 Rule::select => {
40 children.push(Select::new(
41 &pair,
42 vec![],
43 ancestor_variable_list.clone(),
44 )); }
46 Rule::mediaQuery => {
47 media_queries.push(MediaQuery::new(&pair, ancestor_variable_list.clone())); }
49 _ => {}
50 }
51 }
52 }
53 }
54
55 Selects {
56 children, media_queries, variables, }
60 }
61}
62
63impl ToCss for Selects {
64 fn to_css(&self) -> String {
65 let mut result = String::new(); for child in &self.children {
69 result.push_str(&child.to_css()); result.push('\n'); }
72
73 for media_query in &self.media_queries {
75 result.push_str(&media_query.to_css()); result.push('\n'); }
78
79 if !result.is_empty() && result.ends_with("\n\n") {
81 result.pop(); result.pop(); } else if !result.is_empty() && result.ends_with('\n') {
84 result.pop(); }
86
87 result }
89}