Skip to content

Commit dbf1065

Browse files
committed
Fix delayed rendering and add a test for it
1 parent 4da05d6 commit dbf1065

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

src/render.rs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::templates::SplitTemplate;
22
use crate::AppState;
33
use anyhow::Context as AnyhowContext;
44
use async_recursion::async_recursion;
5-
use handlebars::{Context, Handlebars, JsonValue, RenderError, Renderable, BlockContext};
5+
use handlebars::{BlockContext, Context, Handlebars, JsonValue, RenderError, Renderable};
66
use serde::Serialize;
77
use serde_json::{json, Value};
88
use std::borrow::Cow;
@@ -288,20 +288,22 @@ impl<'reg> SplitTemplateRenderer<'reg> {
288288
) -> Result<(), RenderError> {
289289
if let Some(local_vars) = self.local_vars.take() {
290290
let mut render_context = handlebars::RenderContext::new(None);
291-
render_context.push_block(BlockContext::new());
292291
let blk = render_context
293292
.block_mut()
294293
.expect("context created without block");
295-
blk.set_base_value(data);
296294
*blk.local_variables_mut() = local_vars;
295+
let mut blk = BlockContext::new();
296+
blk.set_base_value(data);
297297
blk.set_local_var("row_index", JsonValue::Number(self.row_index.into()));
298+
render_context.push_block(blk);
298299
let mut output = HandlebarWriterOutput(writer);
299300
self.split_template.list_content.render(
300301
self.registry,
301302
&self.ctx,
302303
&mut render_context,
303304
&mut output,
304305
)?;
306+
render_context.pop_block();
305307
self.local_vars = render_context
306308
.block_mut()
307309
.map(|blk| std::mem::take(blk.local_variables_mut()));
@@ -350,7 +352,30 @@ mod tests {
350352
rdr.render_item(&mut output, json!({"x": 1}))?;
351353
rdr.render_item(&mut output, json!({"x": 2}))?;
352354
rdr.render_end(&mut output)?;
353-
assert_eq!(String::from_utf8_lossy(&output), "Hello SQL ! (1 : SQL) (2 : SQL) Goodbye SQL");
355+
assert_eq!(
356+
String::from_utf8_lossy(&output),
357+
"Hello SQL ! (1 : SQL) (2 : SQL) Goodbye SQL"
358+
);
359+
Ok(())
360+
}
361+
362+
#[test]
363+
fn test_delayed() -> anyhow::Result<()> {
364+
let reg = crate::templates::AllTemplates::init().unwrap().handlebars;
365+
let template = Template::compile(
366+
"{{#each_row}}<b> {{x}} {{#delay}} {{x}} </b>{{/delay}}{{/each_row}}{{flush_delayed}}",
367+
)?;
368+
let split = split_template(template);
369+
let mut output = Vec::new();
370+
let mut rdr = SplitTemplateRenderer::new(Arc::new(split), &reg);
371+
rdr.render_start(&mut output, json!(null))?;
372+
rdr.render_item(&mut output, json!({"x": 1}))?;
373+
rdr.render_item(&mut output, json!({"x": 2}))?;
374+
rdr.render_end(&mut output)?;
375+
assert_eq!(
376+
String::from_utf8_lossy(&output),
377+
"<b> 1 <b> 2 2 </b> 1 </b>"
378+
);
354379
Ok(())
355380
}
356381
}

src/templates.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ fn delay_helper<'reg, 'rc>(
113113
}
114114

115115
fn flush_delayed_helper<'reg, 'rc>(
116-
h: &handlebars::Helper<'rc>,
117-
r: &'reg Handlebars<'reg>,
118-
ctx: &'rc Context,
116+
_h: &handlebars::Helper<'rc>,
117+
_r: &'reg Handlebars<'reg>,
118+
_ctx: &'rc Context,
119119
rc: &mut handlebars::RenderContext<'reg, 'rc>,
120120
writer: &mut dyn handlebars::Output,
121121
) -> handlebars::HelperResult {

0 commit comments

Comments
 (0)