yolk/templating/
document.rs1use 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}