use std::fmt::Display;
use nom::sequence::{delimited, pair};
use nom::IResult;
use serde::{Deserialize, Serialize};
use crate::domain::parameter::Parameter;
use crate::error::ParserError;
use crate::lexer::{Token, TokenStream};
use crate::tokens::id;
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SimpleAction {
pub name: String,
#[serde(default)]
pub parameters: Vec<Parameter>,
}
impl SimpleAction {
pub const fn new(name: String, parameters: Vec<Parameter>) -> Self {
Self { name, parameters }
}
pub fn parse(input: TokenStream) -> IResult<TokenStream, Self, ParserError> {
let (output, (name, parameters)) = delimited(
Token::OpenParen,
pair(id, Parameter::parse_parameters),
Token::CloseParen,
)(input)?;
Ok((output, Self::new(name, parameters)))
}
}
impl Display for SimpleAction {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"({} {})",
self.name,
self.parameters
.iter()
.map(ToString::to_string)
.collect::<Vec<_>>()
.join(" ")
)
}
}