1use pest::Parser;
2use pest::iterators::Pair;
3use crate::selects::ToCss;
4use crate::selects::select::Select;
5use crate::selects::media_query::MediaQuery;
6
7#[derive(Parser)]
8#[grammar = "less.pest"]
9pub struct LessParser;
10
11pub enum LessAst {
13 Select(Select),
14 MediaQuery(MediaQuery),
15}
16
17impl ToCss for LessAst {
18 fn to_css(&self) -> String {
19 match self {
20 LessAst::Select(select) => select.to_css(),
21 LessAst::MediaQuery(media_query) => media_query.to_css(),
22 }
23 }
24}
25
26pub fn parse(source: &str) -> Result<LessAst, String> {
36 match LessParser::parse(Rule::selects, source) {
38 Ok(mut pairs) => {
39 let pair = pairs.next().unwrap();
40
41 let inner_pairs: Vec<Pair<Rule>> = pair.into_inner().collect();
42
43 for inner_pair in inner_pairs {
44 match inner_pair.as_rule() {
45 Rule::select => {
46 let select = Select::new(&inner_pair, vec![], vec![]);
47 return Ok(LessAst::Select(select));
48 },
49 Rule::mediaQuery => {
51 let media_query = MediaQuery::new(&inner_pair, vec![]);
52 return Ok(LessAst::MediaQuery(media_query));
53 },
54 _ => continue,
55 }
56 }
57
58 Err("No valid LESS content found".to_string())
59 },
60 Err(e) => Err(format!("Parse error: {}", e)),
61 }
62}