Skip to main content

scheme_edit/
document.rs

1use crate::cst::{Item, Node};
2use crate::lexer::ParseError;
3use crate::parser::Parser;
4
5/// A whole source file: top-level forms plus all surrounding trivia.
6#[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    /// Data nodes only, trivia skipped.
18    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}