pddl_parser/plan/
durative_action.rs1use std::fmt::Display;
2
3use nom::sequence::{delimited, pair, terminated, tuple};
4use nom::IResult;
5use serde::{Deserialize, Serialize};
6
7use crate::domain::parameter::Parameter;
8use crate::error::ParserError;
9use crate::lexer::{Token, TokenStream};
10use crate::tokens;
11use crate::tokens::id;
12
13#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd)]
15pub struct DurativeAction {
16 pub name: String,
18 #[serde(default)]
20 pub parameters: Vec<Parameter>,
21 pub duration: f64,
23 pub timestamp: f64,
25}
26
27impl DurativeAction {
28 pub const fn new(name: String, parameters: Vec<Parameter>, duration: f64, timestamp: f64) -> Self {
37 Self {
38 name,
39 parameters,
40 duration,
41 timestamp,
42 }
43 }
44
45 pub fn parse(input: TokenStream) -> IResult<TokenStream, Self, ParserError> {
47 let (output, (timestamp, (name, parameters), duration)) = tuple((
48 terminated(tokens::float, Token::Colon),
49 delimited(
50 Token::OpenParen,
51 pair(id, Parameter::parse_parameters),
52 Token::CloseParen,
53 ),
54 delimited(Token::OpenBracket, tokens::float, Token::CloseBracket),
55 ))(input)?;
56 Ok((output, Self::new(name, parameters, duration, timestamp)))
57 }
58}
59
60impl Display for DurativeAction {
61 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
62 write!(
63 f,
64 "({} {})",
65 self.name,
66 self.parameters
67 .iter()
68 .map(ToString::to_string)
69 .collect::<Vec<_>>()
70 .join(" ")
71 )
72 }
73}