use crate::cst::{Item, Node};
use crate::lexer::ParseError;
use crate::parser::Parser;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Document {
pub items: Vec<Item>,
}
impl Document {
pub fn parse(src: &str) -> Result<Self, ParseError> {
let items = Parser::new(src).parse_items(None, (1, 1))?;
Ok(Document { items })
}
pub fn forms(&self) -> impl Iterator<Item = &Node> {
self.items.iter().filter_map(|i| match i {
Item::Node(n) => Some(n),
_ => None,
})
}
pub fn forms_mut(&mut self) -> impl Iterator<Item = &mut Node> {
self.items.iter_mut().filter_map(|i| match i {
Item::Node(n) => Some(n),
_ => None,
})
}
}
impl std::fmt::Display for Document {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
for item in &self.items {
item.fmt(f)?;
}
Ok(())
}
}