pddl 0.2.0

A PDDL 3.1 parser, strongly typed
Documentation
use crate::pretty_print::{sealed, PrettyRenderer};
use crate::types::Timeless;
use crate::visitor::{Accept, Visitor};
use pretty::RcDoc;

impl sealed::Sealed for Timeless {}

impl Visitor<Timeless, RcDoc<'static>> for PrettyRenderer {
    fn visit(&self, value: &Timeless) -> RcDoc<'static> {
        if value.values().is_empty() {
            return RcDoc::nil();
        }
        RcDoc::text("(:timeless")
            .append(RcDoc::softline())
            .append(RcDoc::intersperse(
                value.values().iter().map(|lit| lit.accept(self)),
                RcDoc::softline(),
            ))
            .nest(4)
            .group()
            .append(")")
    }
}

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

    #[test]
    fn timeless_empty_works() {
        let t = Timeless::default();
        assert_eq!(prettify!(t, 20), "");
    }

    #[test]
    fn timeless_non_empty_works() {
        use crate::{AtomicFormula, Literal, Name};
        let af =
            AtomicFormula::new_predicate(crate::Predicate::new_string("p"), vec![Name::new("x")]);
        let t = Timeless::new(vec![Literal::new(af)]);
        assert_eq!(prettify!(t, 20), "(:timeless (p x))");
    }
}