Skip to main content

pddl_ish_parser/parser/
parameter.rs

1use regex::Regex;
2use crate::models::parser_error::ParserError;
3use super::error_context::get_error_context;
4
5#[derive(Debug, PartialEq, Clone)]
6pub struct Parameter {
7    pub name: String,
8    pub param_type: String,
9}
10
11pub fn extract_parameters(input: &str) -> Result<String, ParserError> {
12    let re = Regex::new(r":parameters\s*(?P<parameters>\(.*?\))").expect("Failed to compile parameters regex");
13    Ok(re
14        .captures(input)
15        .and_then(|caps| caps.name("parameters"))
16        .map(|m| m.as_str())
17        .ok_or_else(|| ParserError::new("Error parsing parameters".to_string(), get_error_context(input)))?
18        .to_string())
19}
20
21pub fn parse_parameters(input: &str) -> Result<Vec<Parameter>, ParserError> {
22    // Regex pattern to match `?name - type` and `name - type` patterns within the parentheses
23    let re = Regex::new(r"\??\s*(\w+)\s*-\s*(\w+)").unwrap();
24    let mut parameters = Vec::new();
25
26    for caps in re.captures_iter(input) {
27        let name = caps.get(1).unwrap().as_str().to_string();
28        let param_type = caps.get(2).unwrap().as_str().to_string();
29        parameters.push(Parameter { name, param_type });
30    }
31
32    Ok(parameters)
33}