pddl/parsers/
domain_constraints_def.rs

1//! Provides parsers for domain constraint definitions.
2
3use nom::combinator::map;
4
5use crate::parsers::{parse_con_gd, prefix_expr, ParseResult, Span};
6use crate::types::DomainConstraintsDef;
7
8/// Parses domain constraint definitions, i.e. `(:constraints <con-gd>)`.
9///
10/// ## Example
11/// ```
12/// # use pddl::parsers::{parse_domain_constraints_def, parse_functions_def, preamble::*};
13/// # use pddl::{Variable, AtomicFormulaSkeleton, Predicate, PredicateDefinitions, FunctionTypedList, FunctionTyped, AtomicFunctionSkeleton, FunctionSymbol, Functions, ConGD, DomainConstraintsDef};
14/// # use pddl::{Type, Typed, TypedList};
15///
16/// let input = "(:constraints (and))";
17/// assert!(parse_domain_constraints_def(input).is_value(
18///     DomainConstraintsDef::new(ConGD::new_and([]))
19/// ));
20/// ```
21pub fn parse_domain_constraints_def<'a, T: Into<Span<'a>>>(
22    input: T,
23) -> ParseResult<'a, DomainConstraintsDef> {
24    map(
25        prefix_expr(":constraints", parse_con_gd),
26        DomainConstraintsDef::new,
27    )(input.into())
28}
29
30impl crate::parsers::Parser for DomainConstraintsDef {
31    type Item = DomainConstraintsDef;
32
33    /// See [`parse_domain_constraints_def`].
34    fn parse<'a, S: Into<Span<'a>>>(input: S) -> ParseResult<'a, Self::Item> {
35        parse_domain_constraints_def(input)
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use crate::parsers::UnwrapValue;
42    use crate::{ConGD, DomainConstraintsDef, Parser};
43
44    #[test]
45    fn test_parse() {
46        let input = "(:constraints (and))";
47        assert!(DomainConstraintsDef::parse(input)
48            .is_value(DomainConstraintsDef::new(ConGD::new_and([]))));
49    }
50}