rust_less/selects/
media_query.rs1use pest::iterators::Pair;
2use crate::parser::Rule;
3use crate::utils::get_variable;
4use crate::selects::{Variable, Select, ToCss};
5
6#[derive(Debug)]
7pub struct MediaQuery {
8 pub query_expression: String,
9 pub children: Vec<Select>,
10 pub variable_list: Vec<Variable>,
11 pub nested_media_queries: Vec<MediaQuery>, pub span: (usize, usize),
13}
14
15impl MediaQuery {
16 pub fn new(pair: &Pair<Rule>, ancestor_variable_list: Vec<Variable>) -> Self {
17 let mut query_expression = String::new();
18 let mut children = vec![];
19 let mut variable_list = vec![];
20 let mut nested_media_queries = vec![]; let span = (pair.as_span().start(), pair.as_span().end());
22
23 for inner_pair in pair.clone().into_inner() {
24 match inner_pair.as_rule() {
25 Rule::mediaQueryExpression => {
26 query_expression = inner_pair.as_span().as_str().to_string();
27 }
28 Rule::select => {
29 let mut new_ancestor_variable_list = ancestor_variable_list.clone();
30 for item in variable_list.clone() {
31 new_ancestor_variable_list.insert(0, item);
32 }
33 children.push(Select::new(&inner_pair, vec![], new_ancestor_variable_list));
34 }
35 Rule::variable => {
36 variable_list.insert(0, get_variable(inner_pair));
37 }
38 Rule::mediaQuery => {
39 let mut new_ancestor_variable_list = ancestor_variable_list.clone();
41 for item in variable_list.clone() {
42 new_ancestor_variable_list.insert(0, item);
43 }
44 nested_media_queries.push(MediaQuery::new(&inner_pair, new_ancestor_variable_list));
45 }
46 _ => {}
47 }
48 }
49
50 MediaQuery {
51 query_expression,
52 children,
53 variable_list,
54 nested_media_queries, span,
56 }
57 }
58}
59
60impl ToCss for MediaQuery {
61 fn to_css(&self) -> String {
62 let mut result = String::from("@media ");
63 result.push_str(&self.query_expression);
64 result.push_str(" {\n");
65
66 for child in &self.children {
68 result.push_str(&child.to_css());
69 }
70
71 for nested_query in &self.nested_media_queries {
73 result.push_str(&nested_query.to_css());
74 }
75
76 result.push_str("}\n");
77 result
78 }
79}