pddl_parser/domain/
parameter.rs

1use nom::branch::alt;
2use nom::combinator::map;
3use nom::multi::many0;
4use nom::IResult;
5use serde::{Deserialize, Serialize};
6
7use crate::error::ParserError;
8use crate::lexer::TokenStream;
9use crate::tokens::{id, var};
10
11/// A parameter (untyped). This is a wrapper around a string.
12#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
13pub struct Parameter(String);
14
15impl From<String> for Parameter {
16    fn from(s: String) -> Self {
17        Parameter(s)
18    }
19}
20
21impl From<&str> for Parameter {
22    fn from(s: &str) -> Self {
23        Parameter(s.to_string())
24    }
25}
26
27impl Parameter {
28    /// Parse a list of parameters from a token stream.
29    pub fn parse_parameters(input: TokenStream) -> IResult<TokenStream, Vec<Parameter>, ParserError> {
30        log::debug!("BEGIN > parse_parameters {:?}", input.span());
31        let (output, params) = many0(map(alt((id, var)), Into::into))(input)?;
32        log::debug!("END < parse_parameters {:?}", output.span());
33        Ok((output, params))
34    }
35
36    /// Convert the parameter to PDDL.
37    pub fn to_pddl(&self) -> String {
38        self.0.clone()
39    }
40}
41
42impl ToString for Parameter {
43    fn to_string(&self) -> String {
44        self.0.clone()
45    }
46}