1use crate::cst::{Item, Node};
2use crate::lexer::ParseError;
3use crate::parser::Parser;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct Document {
8 pub items: Vec<Item>,
9}
10
11impl Document {
12 pub fn parse(src: &str) -> Result<Self, ParseError> {
13 let items = Parser::new(src).parse_items(None, (1, 1))?;
14 Ok(Document { items })
15 }
16
17 pub fn forms(&self) -> impl Iterator<Item = &Node> {
19 self.items.iter().filter_map(|i| match i {
20 Item::Node(n) => Some(n),
21 _ => None,
22 })
23 }
24
25 pub fn forms_mut(&mut self) -> impl Iterator<Item = &mut Node> {
26 self.items.iter_mut().filter_map(|i| match i {
27 Item::Node(n) => Some(n),
28 _ => None,
29 })
30 }
31}
32
33impl std::fmt::Display for Document {
34 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35 for item in &self.items {
36 item.fmt(f)?;
37 }
38 Ok(())
39 }
40}