use nom::multi::many0;
use serde::{Deserialize, Serialize};
use super::action::Action;
use crate::error::ParserError;
use crate::lexer::TokenStream;
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd)]
pub struct Plan(pub Vec<Action>);
impl Plan {
pub fn parse(input: TokenStream) -> Result<Self, ParserError> {
let (output, items) = many0(Action::parse)(input)?;
if !output.is_empty() {
log::error!("Plan parser failed: {:?}", output.peek_n(10));
return Err(ParserError::ExpectedEndOfInput);
}
Ok(Plan(items))
}
pub fn actions(&self) -> impl Iterator<Item = &Action> {
self.0.iter()
}
}
impl IntoIterator for Plan {
type IntoIter = std::vec::IntoIter<Self::Item>;
type Item = Action;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl FromIterator<Action> for Plan {
fn from_iter<T: IntoIterator<Item = Action>>(iter: T) -> Self {
Self(iter.into_iter().collect())
}
}