Skip to main content

rskit_util/template/
renderer.rs

1use super::Placeholder;
2use super::error::TemplateError;
3use super::{Template, TemplatePart};
4use std::fmt;
5
6impl<P> Template<P>
7where
8    P: Placeholder,
9{
10    /// Render the template using a placeholder renderer callback.
11    pub fn render_with<F, E>(&self, mut render: F) -> Result<String, TemplateError>
12    where
13        F: FnMut(P) -> Result<String, E>,
14        E: fmt::Display,
15    {
16        let mut rendered = String::new();
17        for part in &self.parts {
18            match part {
19                TemplatePart::Literal(value) => rendered.push_str(value),
20                TemplatePart::Placeholder(placeholder) => {
21                    let val = render(*placeholder)
22                        .map_err(|error| TemplateError::Render(error.to_string()))?;
23                    rendered.push_str(&val);
24                }
25            }
26        }
27        Ok(rendered)
28    }
29}