pddl/parsers/goal_def.rs
1//! Provides parsers for pre-GD goal definitions.
2
3use crate::parsers::{parse_pre_gd, prefix_expr, ParseResult, Span};
4use crate::types::GoalDef;
5use nom::combinator::map;
6
7/// Parses pre-GD goal definitions.
8///
9/// ## Example
10/// ```
11/// # use pddl::parsers::{parse_problem_goal_def, preamble::*};
12/// # use pddl::{AtomicFormula, GoalDef, GoalDefinition, PreferenceGD, PreconditionGoalDefinition, Term};
13/// let input = "(:goal (= x y))";
14/// assert!(parse_problem_goal_def(input).is_value(
15/// GoalDef::from(
16/// PreconditionGoalDefinition::Preference(
17/// PreferenceGD::Goal(
18/// GoalDefinition::AtomicFormula(
19/// AtomicFormula::new_equality(
20/// Term::Name("x".into()),
21/// Term::Name("y".into())
22/// )
23/// )
24/// )
25/// )
26/// )
27/// ));
28/// ```
29pub fn parse_problem_goal_def<'a, T: Into<Span<'a>>>(input: T) -> ParseResult<'a, GoalDef> {
30 map(prefix_expr(":goal", parse_pre_gd), GoalDef::new)(input.into())
31}
32
33impl crate::parsers::Parser for GoalDef {
34 type Item = GoalDef;
35
36 /// See [`parse_problem_goal_def`].
37 fn parse<'a, S: Into<Span<'a>>>(input: S) -> ParseResult<'a, Self::Item> {
38 parse_problem_goal_def(input)
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use crate::parsers::UnwrapValue;
45 use crate::{
46 AtomicFormula, GoalDef, GoalDefinition, Parser, PreconditionGoalDefinition, PreferenceGD,
47 Term,
48 };
49
50 #[test]
51 fn test_parse() {
52 let input = "(:goal (= x y))";
53 assert!(GoalDef::parse(input).is_value(GoalDef::from(
54 PreconditionGoalDefinition::Preference(PreferenceGD::Goal(
55 GoalDefinition::AtomicFormula(AtomicFormula::new_equality(
56 Term::Name("x".into()),
57 Term::Name("y".into())
58 ))
59 ))
60 )));
61 }
62}