use pest::Parser;
use pest::iterators::Pair;
use crate::selects::ToCss;
use crate::selects::select::Select;
use crate::selects::media_query::MediaQuery;
#[derive(Parser)]
#[grammar = "less.pest"]
pub struct LessParser;
pub enum LessAst {
Select(Select),
MediaQuery(MediaQuery),
}
impl ToCss for LessAst {
fn to_css(&self) -> String {
match self {
LessAst::Select(select) => select.to_css(),
LessAst::MediaQuery(media_query) => media_query.to_css(),
}
}
}
pub fn parse(source: &str) -> Result<LessAst, String> {
match LessParser::parse(Rule::selects, source) {
Ok(mut pairs) => {
let pair = pairs.next().unwrap();
let inner_pairs: Vec<Pair<Rule>> = pair.into_inner().collect();
for inner_pair in inner_pairs {
match inner_pair.as_rule() {
Rule::select => {
let select = Select::new(&inner_pair, vec![], vec![]);
return Ok(LessAst::Select(select));
},
Rule::mediaQuery => {
let media_query = MediaQuery::new(&inner_pair, vec![]);
return Ok(LessAst::MediaQuery(media_query));
},
_ => continue,
}
}
Err("No valid LESS content found".to_string())
},
Err(e) => Err(format!("Parse error: {}", e)),
}
}