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}