scheme-edit 0.1.0

Lossless Scheme S-expression parser and editor (toml_edit-style CST)
Documentation
use crate::cst::{Item, Node};
use crate::lexer::ParseError;
use crate::parser::Parser;

/// A whole source file: top-level forms plus all surrounding trivia.
#[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 })
    }

    /// Data nodes only, trivia skipped.
    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(())
    }
}