pddl 0.2.0

A PDDL 3.1 parser, strongly typed
Documentation
use crate::pretty_print::{sealed, PrettyRenderer};
use crate::types::{
    AssignOp, BinaryComparison, BinaryOp, DurationOperator, Interval, MultiOp, Optimization,
    Requirement, TimeSpecifier, TimedAssignOperator,
};
use crate::visitor::Visitor;
use pretty::RcDoc;

impl sealed::Sealed for AssignOp {}
impl sealed::Sealed for TimedAssignOperator {}
impl sealed::Sealed for BinaryOp {}
impl sealed::Sealed for BinaryComparison {}
impl sealed::Sealed for DurationOperator {}
impl sealed::Sealed for MultiOp {}
impl sealed::Sealed for Optimization {}
impl sealed::Sealed for Interval {}
impl sealed::Sealed for TimeSpecifier {}
impl sealed::Sealed for Requirement {}

impl Visitor<AssignOp, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &AssignOp) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

impl Visitor<TimedAssignOperator, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &TimedAssignOperator) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

impl Visitor<BinaryOp, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &BinaryOp) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

impl Visitor<BinaryComparison, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &BinaryComparison) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

impl Visitor<DurationOperator, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &DurationOperator) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

impl Visitor<MultiOp, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &MultiOp) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

impl Visitor<Optimization, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &Optimization) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

impl Visitor<Interval, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &Interval) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

impl Visitor<TimeSpecifier, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &TimeSpecifier) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

impl Visitor<Requirement, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &Requirement) -> RcDoc<'static> {
        RcDoc::text(value.to_string())
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::pretty_print::prettify;
    use crate::visitor::Accept;

    #[test]
    fn assign_op_works() {
        assert_eq!(prettify!(AssignOp::Assign, 10), "assign");
        assert_eq!(prettify!(AssignOp::ScaleUp, 10), "scale-up");
        assert_eq!(prettify!(AssignOp::Increase, 10), "increase");
    }

    #[test]
    fn binary_op_works() {
        assert_eq!(prettify!(BinaryOp::Addition, 10), "+");
        assert_eq!(prettify!(BinaryOp::Multiplication, 10), "*");
    }

    #[test]
    fn requirement_works() {
        assert_eq!(prettify!(Requirement::Strips, 10), ":strips");
        assert_eq!(prettify!(Requirement::Typing, 10), ":typing");
    }

    #[test]
    fn time_specifier_works() {
        assert_eq!(prettify!(TimeSpecifier::Start, 10), "start");
        assert_eq!(prettify!(TimeSpecifier::End, 10), "end");
    }

    #[test]
    fn assign_op_t_works() {
        assert_eq!(prettify!(TimedAssignOperator::Increase, 10), "increase");
        assert_eq!(prettify!(TimedAssignOperator::Decrease, 10), "decrease");
    }

    #[test]
    fn binary_comp_all_variants() {
        assert_eq!(prettify!(BinaryComparison::GreaterThan, 10), ">");
        assert_eq!(prettify!(BinaryComparison::LessThan, 10), "<");
        assert_eq!(prettify!(BinaryComparison::Equal, 10), "=");
        assert_eq!(prettify!(BinaryComparison::GreaterOrEqual, 10), ">=");
        assert_eq!(prettify!(BinaryComparison::LessThanOrEqual, 10), "<=");
    }

    #[test]
    fn d_op_all_variants() {
        assert_eq!(prettify!(DurationOperator::Equal, 10), "=");
        assert_eq!(prettify!(DurationOperator::GreaterOrEqual, 10), ">=");
        assert_eq!(prettify!(DurationOperator::LessThanOrEqual, 10), "<=");
    }

    #[test]
    fn multi_op_works() {
        assert_eq!(prettify!(MultiOp::Addition, 10), "+");
        assert_eq!(prettify!(MultiOp::Multiplication, 10), "*");
    }

    #[test]
    fn optimization_works() {
        assert_eq!(prettify!(Optimization::Minimize, 10), "minimize");
        assert_eq!(prettify!(Optimization::Maximize, 10), "maximize");
    }

    #[test]
    fn interval_works() {
        assert_eq!(prettify!(Interval::All, 10), "all");
    }

    #[test]
    fn requirement_more_variants() {
        assert_eq!(
            prettify!(Requirement::NegativePreconditions, 10),
            ":negative-preconditions"
        );
        assert_eq!(
            prettify!(Requirement::DisjunctivePreconditions, 10),
            ":disjunctive-preconditions"
        );
        assert_eq!(
            prettify!(Requirement::DurativeActions, 10),
            ":durative-actions"
        );
    }
}