rust_less/
parser.rs

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
11/// 表示解析后的LESS抽象语法树
12pub 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
26/// 解析LESS字符串,返回抽象语法树
27///
28/// # 参数
29///
30/// * `source` - LESS源代码字符串
31///
32/// # 返回值
33///
34/// 成功时返回`Ok(LessAst)`,失败时返回`Err(String)`
35pub fn parse(source: &str) -> Result<LessAst, String> {
36    // 修正:使用selects而不是less
37    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                    // 修正:使用mediaQuery而不是media_query,并且传递空的变量列表作为第二个参数
50                    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}