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