1use pest::error::Error as PestError;
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5pub enum ParseError {
6 #[error("Grammar parsing error: {0}")]
7 Pest(#[from] PestError<Rule>),
8}
9
10use pest_derive::Parser;
11
12#[derive(Parser)]
13#[grammar = "cow.pest"]
14pub struct CowParser;
15
16use pest::Parser;
17
18pub fn parse_cow_source(source: &str) -> Result<pest::iterators::Pairs<Rule>, ParseError> {
19 let pairs = CowParser::parse(Rule::program, source)?;
20 Ok(pairs)
21}
22
23pub fn get_commands(source: &str) -> Result<Vec<String>, ParseError> {
24 let pairs = CowParser::parse(Rule::program, source)?;
25
26 let commands = pairs
27 .filter(|pair| pair.as_rule() == Rule::command)
28 .map(|pair| pair.as_str().to_string())
29 .collect();
30
31 Ok(commands)
32}