pddl_parser/domain/
predicate.rs1use nom::multi::many0;
2use nom::sequence::{delimited, pair, preceded};
3use nom::IResult;
4use serde::{Deserialize, Serialize};
5
6use super::parameter::Parameter;
7use crate::error::ParserError;
8use crate::lexer::{Token, TokenStream};
9use crate::tokens::id;
10
11#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
13pub struct Predicate {
14 pub name: String,
16 #[serde(default)]
18 pub parameters: Vec<Parameter>,
19}
20
21impl Predicate {
22 pub fn parse_predicates(input: TokenStream) -> IResult<TokenStream, Vec<Predicate>, ParserError> {
24 log::debug!("BEGIN > parse_predicates {:?}", input.span());
25 let (output, predicates) = delimited(
26 Token::OpenParen,
27 preceded(
28 Token::Predicates,
29 many0(delimited(
30 Token::OpenParen,
31 pair(id, Parameter::parse_parameters),
32 Token::CloseParen,
33 )),
34 ),
35 Token::CloseParen,
36 )(input)?;
37 let predicates = predicates
38 .into_iter()
39 .map(|(name, parameters)| Predicate { name, parameters })
40 .collect();
41 log::debug!("END < parse_predicates {:?}", output.span());
42 Ok((output, predicates))
43 }
44
45 pub fn to_pddl(&self) -> String {
47 format!(
48 "({} {})",
49 self.name,
50 self.parameters
51 .iter()
52 .map(Parameter::to_pddl)
53 .collect::<Vec<_>>()
54 .join(" ")
55 )
56 }
57}