@@ -346,8 +346,10 @@ impl Configurator {
346346 let mut progress = ProgressBar :: new ( resources. len ( ) as u64 , self . progress_format ) ?;
347347 let discovery = & mut self . discovery . clone ( ) ;
348348 for resource in resources {
349- progress. set_resource ( & resource. name , & resource. resource_type ) ;
350- progress. write_activity ( format ! ( "Get '{}'" , resource. name) . as_str ( ) ) ;
349+ let evaluated_name = self . evaluate_resource_name ( & resource) ?;
350+
351+ progress. set_resource ( & evaluated_name, & resource. resource_type ) ;
352+ progress. write_activity ( format ! ( "Get '{evaluated_name}'" ) . as_str ( ) ) ;
351353 if self . skip_resource ( & resource) ? {
352354 progress. write_increment ( 1 ) ;
353355 continue ;
@@ -376,20 +378,20 @@ impl Configurator {
376378
377379 match & mut get_result {
378380 GetResult :: Resource ( ref mut resource_result) => {
379- self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, resource . name ) , serde_json:: to_value ( & resource_result. actual_state ) ?) ;
381+ self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, evaluated_name ) , serde_json:: to_value ( & resource_result. actual_state ) ?) ;
380382 get_metadata_from_result ( Some ( & mut self . context ) , & mut resource_result. actual_state , & mut metadata) ?;
381383 } ,
382384 GetResult :: Group ( group) => {
383385 let mut results = Vec :: < Value > :: new ( ) ;
384386 for result in group {
385387 results. push ( serde_json:: to_value ( & result. result ) ?) ;
386388 }
387- self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, resource . name ) , Value :: Array ( results. clone ( ) ) ) ;
389+ self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, evaluated_name ) , Value :: Array ( results. clone ( ) ) ) ;
388390 } ,
389391 }
390392 let resource_result = config_result:: ResourceGetResult {
391393 metadata : Some ( metadata) ,
392- name : resource . name . clone ( ) ,
394+ name : evaluated_name ,
393395 resource_type : resource. resource_type . clone ( ) ,
394396 result : get_result. clone ( ) ,
395397 } ;
@@ -424,8 +426,10 @@ impl Configurator {
424426 let mut progress = ProgressBar :: new ( resources. len ( ) as u64 , self . progress_format ) ?;
425427 let discovery = & mut self . discovery . clone ( ) ;
426428 for resource in resources {
427- progress. set_resource ( & resource. name , & resource. resource_type ) ;
428- progress. write_activity ( format ! ( "Set '{}'" , resource. name) . as_str ( ) ) ;
429+ let evaluated_name = self . evaluate_resource_name ( & resource) ?;
430+
431+ progress. set_resource ( & evaluated_name, & resource. resource_type ) ;
432+ progress. write_activity ( format ! ( "Set '{evaluated_name}'" ) . as_str ( ) ) ;
429433 if self . skip_resource ( & resource) ? {
430434 progress. write_increment ( 1 ) ;
431435 continue ;
@@ -533,20 +537,20 @@ impl Configurator {
533537 } ;
534538 match & mut set_result {
535539 SetResult :: Resource ( resource_result) => {
536- self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, resource . name ) , serde_json:: to_value ( & resource_result. after_state ) ?) ;
540+ self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, evaluated_name ) , serde_json:: to_value ( & resource_result. after_state ) ?) ;
537541 get_metadata_from_result ( Some ( & mut self . context ) , & mut resource_result. after_state , & mut metadata) ?;
538542 } ,
539543 SetResult :: Group ( group) => {
540544 let mut results = Vec :: < Value > :: new ( ) ;
541545 for result in group {
542546 results. push ( serde_json:: to_value ( & result. result ) ?) ;
543547 }
544- self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, resource . name ) , Value :: Array ( results. clone ( ) ) ) ;
548+ self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, evaluated_name ) , Value :: Array ( results. clone ( ) ) ) ;
545549 } ,
546550 }
547551 let resource_result = config_result:: ResourceSetResult {
548552 metadata : Some ( metadata) ,
549- name : resource . name . clone ( ) ,
553+ name : evaluated_name ,
550554 resource_type : resource. resource_type . clone ( ) ,
551555 result : set_result. clone ( ) ,
552556 } ;
@@ -576,8 +580,10 @@ impl Configurator {
576580 let mut progress = ProgressBar :: new ( resources. len ( ) as u64 , self . progress_format ) ?;
577581 let discovery = & mut self . discovery . clone ( ) ;
578582 for resource in resources {
579- progress. set_resource ( & resource. name , & resource. resource_type ) ;
580- progress. write_activity ( format ! ( "Test '{}'" , resource. name) . as_str ( ) ) ;
583+ let evaluated_name = self . evaluate_resource_name ( & resource) ?;
584+
585+ progress. set_resource ( & evaluated_name, & resource. resource_type ) ;
586+ progress. write_activity ( format ! ( "Test '{evaluated_name}'" ) . as_str ( ) ) ;
581587 if self . skip_resource ( & resource) ? {
582588 progress. write_increment ( 1 ) ;
583589 continue ;
@@ -607,20 +613,20 @@ impl Configurator {
607613 } ;
608614 match & mut test_result {
609615 TestResult :: Resource ( resource_test_result) => {
610- self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, resource . name ) , serde_json:: to_value ( & resource_test_result. actual_state ) ?) ;
616+ self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, evaluated_name ) , serde_json:: to_value ( & resource_test_result. actual_state ) ?) ;
611617 get_metadata_from_result ( Some ( & mut self . context ) , & mut resource_test_result. actual_state , & mut metadata) ?;
612618 } ,
613619 TestResult :: Group ( group) => {
614620 let mut results = Vec :: < Value > :: new ( ) ;
615621 for result in group {
616622 results. push ( serde_json:: to_value ( & result. result ) ?) ;
617623 }
618- self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, resource . name ) , Value :: Array ( results. clone ( ) ) ) ;
624+ self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, evaluated_name ) , Value :: Array ( results. clone ( ) ) ) ;
619625 } ,
620626 }
621627 let resource_result = config_result:: ResourceTestResult {
622628 metadata : Some ( metadata) ,
623- name : resource . name . clone ( ) ,
629+ name : evaluated_name ,
624630 resource_type : resource. resource_type . clone ( ) ,
625631 result : test_result. clone ( ) ,
626632 } ;
@@ -653,8 +659,10 @@ impl Configurator {
653659 let resources = self . config . resources . clone ( ) ;
654660 let discovery = & mut self . discovery . clone ( ) ;
655661 for resource in & resources {
656- progress. set_resource ( & resource. name , & resource. resource_type ) ;
657- progress. write_activity ( format ! ( "Export '{}'" , resource. name) . as_str ( ) ) ;
662+ let evaluated_name = self . evaluate_resource_name ( resource) ?;
663+
664+ progress. set_resource ( & evaluated_name, & resource. resource_type ) ;
665+ progress. write_activity ( format ! ( "Export '{evaluated_name}'" ) . as_str ( ) ) ;
658666 if self . skip_resource ( resource) ? {
659667 progress. write_increment ( 1 ) ;
660668 continue ;
@@ -673,7 +681,7 @@ impl Configurator {
673681 return Err ( e) ;
674682 } ,
675683 } ;
676- self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, resource . name ) , serde_json:: to_value ( & export_result. actual_state ) ?) ;
684+ self . context . references . insert ( format ! ( "{}:{}" , resource. resource_type, evaluated_name ) , serde_json:: to_value ( & export_result. actual_state ) ?) ;
677685 progress. set_result ( & serde_json:: to_value ( export_result) ?) ;
678686 progress. write_increment ( 1 ) ;
679687 }
@@ -912,37 +920,35 @@ impl Configurator {
912920 Ok ( ( ) )
913921 }
914922
915- /// Process resource name expressions for non-copy resources .
923+ /// Evaluate resource name expression and return the resolved name .
916924 ///
917- /// This method evaluates DSC expressions in resource names after parameters
918- /// have been processed, ensuring that parameter references work correctly.
925+ /// This method evaluates DSC expressions in a resource name, handling both
926+ /// expressions and literals appropriately.
927+ ///
928+ /// # Arguments
929+ /// * `resource` - The resource whose name should be evaluated
930+ ///
931+ /// # Returns
932+ /// * `String` - The evaluated resource name
919933 ///
920934 /// # Errors
921935 ///
922936 /// This function will return an error if:
923937 /// - Resource name expression evaluation fails
924938 /// - Expression does not result in a string value
925939 /// - Statement parser encounters invalid syntax
926- pub fn process_resource_names ( & mut self ) -> Result < ( ) , DscError > {
927- let mut config = self . config . clone ( ) ;
928- let config_copy = config. clone ( ) ;
929-
930- for resource in config_copy. resources {
931- // skip resources that were created from copy loops (they already have evaluated names)
932- if resource. copy . is_none ( ) && resource. name . starts_with ( '[' ) && resource. name . ends_with ( ']' ) {
933- // process resource name expressions for non-copy resources
934- let Value :: String ( new_name) = self . statement_parser . parse_and_execute ( & resource. name , & self . context ) ? else {
935- return Err ( DscError :: Parser ( t ! ( "configure.mod.nameResultNotString" ) . to_string ( ) ) )
936- } ;
937- // find and update the resource name in the config
938- if let Some ( config_resource) = config. resources . iter_mut ( ) . find ( |r| r. name == resource. name && r. resource_type == resource. resource_type ) {
939- config_resource. name = new_name. to_string ( ) ;
940- }
941- }
940+ fn evaluate_resource_name ( & mut self , resource : & Resource ) -> Result < String , DscError > {
941+ // skip resources that were created from copy loops (they already have evaluated names)
942+ if resource. copy . is_some ( ) {
943+ return Ok ( resource. name . clone ( ) ) ;
942944 }
943945
944- self . config = config;
945- Ok ( ( ) )
946+ // evaluate the resource name (handles both expressions and literals)
947+ let Value :: String ( evaluated_name) = self . statement_parser . parse_and_execute ( & resource. name , & self . context ) ? else {
948+ return Err ( DscError :: Parser ( t ! ( "configure.mod.nameResultNotString" ) . to_string ( ) ) )
949+ } ;
950+
951+ Ok ( evaluated_name)
946952 }
947953
948954 fn invoke_property_expressions ( & mut self , properties : Option < & Map < String , Value > > ) -> Result < Option < Map < String , Value > > , DscError > {
0 commit comments