@@ -295,7 +295,7 @@ impl<W: std::io::Write> RenderContext<W> {
295295 } else {
296296 PAGE_SHELL_COMPONENT
297297 } ;
298- let mut shell_renderer = Self :: create_renderer ( shell_component, Arc :: clone ( & app_state) )
298+ let mut shell_renderer = Self :: create_renderer ( shell_component, Arc :: clone ( & app_state) , 0 )
299299 . await
300300 . with_context ( || "The shell component should always exist" ) ?;
301301
@@ -484,20 +484,35 @@ impl<W: std::io::Write> RenderContext<W> {
484484 async fn create_renderer (
485485 component : & str ,
486486 app_state : Arc < AppState > ,
487+ component_index : usize ,
487488 ) -> anyhow:: Result < SplitTemplateRenderer > {
488489 let split_template = app_state
489490 . all_templates
490491 . get_template ( & app_state, component)
491492 . await ?;
492- Ok ( SplitTemplateRenderer :: new ( split_template, app_state) )
493+ Ok ( SplitTemplateRenderer :: new (
494+ split_template,
495+ app_state,
496+ component_index,
497+ ) )
493498 }
494499
495500 /// Set a new current component and return the old one
496501 async fn set_current_component (
497502 & mut self ,
498503 component : & str ,
499504 ) -> anyhow:: Result < Option < SplitTemplateRenderer > > {
500- let new_component = Self :: create_renderer ( component, Arc :: clone ( & self . app_state ) ) . await ?;
505+ let current_component_index = self
506+ . current_component
507+ . as_ref ( )
508+ . map ( |c| c. component_index )
509+ . unwrap_or ( 1 ) ;
510+ let new_component = Self :: create_renderer (
511+ component,
512+ Arc :: clone ( & self . app_state ) ,
513+ current_component_index + 1 ,
514+ )
515+ . await ?;
501516 Ok ( self . current_component . replace ( new_component) )
502517 }
503518
@@ -552,16 +567,22 @@ pub struct SplitTemplateRenderer {
552567 ctx : Context ,
553568 app_state : Arc < AppState > ,
554569 row_index : usize ,
570+ component_index : usize ,
555571}
556572
557573impl SplitTemplateRenderer {
558- fn new ( split_template : Arc < SplitTemplate > , app_state : Arc < AppState > ) -> Self {
574+ fn new (
575+ split_template : Arc < SplitTemplate > ,
576+ app_state : Arc < AppState > ,
577+ component_index : usize ,
578+ ) -> Self {
559579 Self {
560580 split_template,
561581 local_vars : None ,
562582 app_state,
563583 row_index : 0 ,
564584 ctx : Context :: null ( ) ,
585+ component_index,
565586 }
566587 }
567588 fn name ( & self ) -> & str {
@@ -585,6 +606,10 @@ impl SplitTemplateRenderer {
585606 . unwrap_or_default( ) ,
586607 ) ;
587608 let mut render_context = handlebars:: RenderContext :: new ( None ) ;
609+ render_context
610+ . block_mut ( )
611+ . expect ( "context created without block" )
612+ . set_local_var ( "component_index" , JsonValue :: Number ( self . component_index . into ( ) ) ) ;
588613 * self . ctx . data_mut ( ) = data;
589614 let mut output = HandlebarWriterOutput ( writer) ;
590615 self . split_template . before_list . render (
@@ -678,7 +703,7 @@ mod tests {
678703 let mut output = Vec :: new ( ) ;
679704 let config = app_config:: tests:: test_config ( ) ;
680705 let app_state = Arc :: new ( AppState :: init ( & config) . await . unwrap ( ) ) ;
681- let mut rdr = SplitTemplateRenderer :: new ( Arc :: new ( split) , app_state) ;
706+ let mut rdr = SplitTemplateRenderer :: new ( Arc :: new ( split) , app_state, 0 ) ;
682707 rdr. render_start ( & mut output, json ! ( { "name" : "SQL" } ) ) ?;
683708 rdr. render_item ( & mut output, json ! ( { "x" : 1 } ) ) ?;
684709 rdr. render_item ( & mut output, json ! ( { "x" : 2 } ) ) ?;
@@ -699,7 +724,7 @@ mod tests {
699724 let mut output = Vec :: new ( ) ;
700725 let config = app_config:: tests:: test_config ( ) ;
701726 let app_state = Arc :: new ( AppState :: init ( & config) . await . unwrap ( ) ) ;
702- let mut rdr = SplitTemplateRenderer :: new ( Arc :: new ( split) , app_state) ;
727+ let mut rdr = SplitTemplateRenderer :: new ( Arc :: new ( split) , app_state, 0 ) ;
703728 rdr. render_start ( & mut output, json ! ( null) ) ?;
704729 rdr. render_item ( & mut output, json ! ( { "x" : 1 } ) ) ?;
705730 rdr. render_item ( & mut output, json ! ( { "x" : 2 } ) ) ?;
0 commit comments