1use std::io::Write;
2use std::sync;
3
4use liquid_core::error::Result;
5use liquid_core::runtime;
6use liquid_core::runtime::PartialStore;
7use liquid_core::runtime::Renderable;
8
9pub struct Template {
10 pub(crate) template: runtime::Template,
11 pub(crate) partials: Option<sync::Arc<dyn PartialStore + Send + Sync>>,
12}
13
14impl Template {
15 pub fn render(&self, globals: &dyn crate::ObjectView) -> Result<String> {
17 const BEST_GUESS: usize = 10_000;
18 let mut data = Vec::with_capacity(BEST_GUESS);
19 self.render_to(&mut data, globals)?;
20
21 Ok(convert_buffer(data))
22 }
23
24 pub fn render_to(&self, writer: &mut dyn Write, globals: &dyn crate::ObjectView) -> Result<()> {
26 let runtime = runtime::RuntimeBuilder::new().set_globals(globals);
27 let runtime = match self.partials {
28 Some(ref partials) => runtime.set_partials(partials.as_ref()),
29 None => runtime,
30 };
31 let runtime = runtime.build();
32 self.template.render_to(writer, &runtime)
33 }
34}
35
36#[cfg(debug_assertions)]
37fn convert_buffer(buffer: Vec<u8>) -> String {
38 String::from_utf8(buffer)
39 .expect("render can only write UTF-8 because all inputs and processing preserve utf-8")
40}
41
42#[cfg(not(debug_assertions))]
43fn convert_buffer(buffer: Vec<u8>) -> String {
44 unsafe { String::from_utf8_unchecked(buffer) }
45}