@@ -2,7 +2,7 @@ use crate::templates::SplitTemplate;
2
2
use crate :: AppState ;
3
3
use anyhow:: Context as AnyhowContext ;
4
4
use async_recursion:: async_recursion;
5
- use handlebars:: { Context , Handlebars , JsonValue , RenderError , Renderable , BlockContext } ;
5
+ use handlebars:: { BlockContext , Context , Handlebars , JsonValue , RenderError , Renderable } ;
6
6
use serde:: Serialize ;
7
7
use serde_json:: { json, Value } ;
8
8
use std:: borrow:: Cow ;
@@ -288,20 +288,22 @@ impl<'reg> SplitTemplateRenderer<'reg> {
288
288
) -> Result < ( ) , RenderError > {
289
289
if let Some ( local_vars) = self . local_vars . take ( ) {
290
290
let mut render_context = handlebars:: RenderContext :: new ( None ) ;
291
- render_context. push_block ( BlockContext :: new ( ) ) ;
292
291
let blk = render_context
293
292
. block_mut ( )
294
293
. expect ( "context created without block" ) ;
295
- blk. set_base_value ( data) ;
296
294
* blk. local_variables_mut ( ) = local_vars;
295
+ let mut blk = BlockContext :: new ( ) ;
296
+ blk. set_base_value ( data) ;
297
297
blk. set_local_var ( "row_index" , JsonValue :: Number ( self . row_index . into ( ) ) ) ;
298
+ render_context. push_block ( blk) ;
298
299
let mut output = HandlebarWriterOutput ( writer) ;
299
300
self . split_template . list_content . render (
300
301
self . registry ,
301
302
& self . ctx ,
302
303
& mut render_context,
303
304
& mut output,
304
305
) ?;
306
+ render_context. pop_block ( ) ;
305
307
self . local_vars = render_context
306
308
. block_mut ( )
307
309
. map ( |blk| std:: mem:: take ( blk. local_variables_mut ( ) ) ) ;
@@ -350,7 +352,30 @@ mod tests {
350
352
rdr. render_item ( & mut output, json ! ( { "x" : 1 } ) ) ?;
351
353
rdr. render_item ( & mut output, json ! ( { "x" : 2 } ) ) ?;
352
354
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
+ ) ;
354
379
Ok ( ( ) )
355
380
}
356
381
}
0 commit comments