yolk/templating/
document.rs

1use crate::script::eval_ctx::EvalCtx;
2
3use super::{
4    comment_style::CommentStyle,
5    element::{self, render_elements},
6    parser,
7};
8
9use miette::{NamedSource, Result};
10
11#[derive(Debug, arbitrary::Arbitrary)]
12pub struct Document<'a> {
13    comment_style: CommentStyle,
14    elements: Vec<element::Element<'a>>,
15    source: &'a str,
16    source_name: String,
17}
18
19impl<'a> Document<'a> {
20    pub fn render(&self, eval_ctx: &mut EvalCtx) -> Result<String> {
21        let output = render_elements(&self.comment_style, eval_ctx, &self.elements)
22            .map_err(|e| e.into_report(&self.source_name, self.source))?;
23        Ok(output)
24    }
25
26    #[cfg(test)]
27    pub fn parse_string(s: &'a str) -> Result<Self> {
28        Self::parse_string_named("unnamed", s)
29    }
30
31    pub fn parse_string_named(name: &str, s: &'a str) -> Result<Self> {
32        let elements = parser::parse_document(s).map_err(|e| {
33            miette::Report::from(e).with_source_code(NamedSource::new(name, s.to_string()))
34        })?;
35        let comment_style = CommentStyle::try_infer_from_elements(&elements).unwrap_or_default();
36        Ok(Self {
37            elements,
38            comment_style,
39            source: s,
40            source_name: name.to_string(),
41        })
42    }
43}