pddl_parser/domain/
typed_predicate.rs1use nom::combinator::opt;
2use nom::multi::many0;
3use nom::sequence::{delimited, pair, preceded};
4use nom::IResult;
5use serde::{Deserialize, Serialize};
6
7use crate::domain::typed_parameter::TypedParameter;
8use crate::error::ParserError;
9use crate::lexer::{Token, TokenStream};
10use crate::tokens::id;
11
12#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
14pub struct TypedPredicate {
15 pub name: String,
17 #[serde(default)]
19 pub parameters: Vec<TypedParameter>,
20}
21
22impl TypedPredicate {
23 pub fn parse_functions(input: TokenStream) -> IResult<TokenStream, Vec<TypedPredicate>, ParserError> {
25 log::debug!("BEGIN > parse_functions {:?}", input.span());
26 let (output, functions) = opt(delimited(
27 Token::OpenParen,
28 preceded(
29 Token::Functions,
30 many0(delimited(
31 Token::OpenParen,
32 pair(id, TypedParameter::parse_typed_parameters),
33 Token::CloseParen,
34 )),
35 ),
36 Token::CloseParen,
37 ))(input)?;
38 let functions = functions
39 .unwrap_or_default()
40 .into_iter()
41 .map(|(name, parameters)| TypedPredicate { name, parameters })
42 .collect();
43 log::debug!("END < parse_functions {:?}", output.span());
44 Ok((output, functions))
45 }
46
47 pub fn parse_predicates(input: TokenStream) -> IResult<TokenStream, Vec<TypedPredicate>, ParserError> {
49 log::debug!("BEGIN > parse_predicates {:?}", input.span());
50 let (output, predicates) = delimited(
51 Token::OpenParen,
52 preceded(
53 Token::Predicates,
54 many0(delimited(
55 Token::OpenParen,
56 pair(id, TypedParameter::parse_typed_parameters),
57 Token::CloseParen,
58 )),
59 ),
60 Token::CloseParen,
61 )(input)?;
62 let predicates = predicates
63 .into_iter()
64 .map(|(name, parameters)| TypedPredicate { name, parameters })
65 .collect();
66 log::debug!("END < parse_predicates {:?}", output.span());
67 Ok((output, predicates))
68 }
69
70 pub fn to_pddl(&self) -> String {
72 format!(
73 "({} {})",
74 self.name,
75 self.parameters
76 .iter()
77 .map(TypedParameter::to_pddl)
78 .collect::<Vec<_>>()
79 .join(" ")
80 )
81 }
82}