@@ -346,8 +346,10 @@ impl Configurator {
346
346
let mut progress = ProgressBar :: new ( resources. len ( ) as u64 , self . progress_format ) ?;
347
347
let discovery = & mut self . discovery . clone ( ) ;
348
348
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 ( ) ) ;
351
353
if self . skip_resource ( & resource) ? {
352
354
progress. write_increment ( 1 ) ;
353
355
continue ;
@@ -376,20 +378,20 @@ impl Configurator {
376
378
377
379
match & mut get_result {
378
380
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 ) ?) ;
380
382
get_metadata_from_result ( Some ( & mut self . context ) , & mut resource_result. actual_state , & mut metadata) ?;
381
383
} ,
382
384
GetResult :: Group ( group) => {
383
385
let mut results = Vec :: < Value > :: new ( ) ;
384
386
for result in group {
385
387
results. push ( serde_json:: to_value ( & result. result ) ?) ;
386
388
}
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 ( ) ) ) ;
388
390
} ,
389
391
}
390
392
let resource_result = config_result:: ResourceGetResult {
391
393
metadata : Some ( metadata) ,
392
- name : resource . name . clone ( ) ,
394
+ name : evaluated_name ,
393
395
resource_type : resource. resource_type . clone ( ) ,
394
396
result : get_result. clone ( ) ,
395
397
} ;
@@ -424,8 +426,10 @@ impl Configurator {
424
426
let mut progress = ProgressBar :: new ( resources. len ( ) as u64 , self . progress_format ) ?;
425
427
let discovery = & mut self . discovery . clone ( ) ;
426
428
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 ( ) ) ;
429
433
if self . skip_resource ( & resource) ? {
430
434
progress. write_increment ( 1 ) ;
431
435
continue ;
@@ -533,20 +537,20 @@ impl Configurator {
533
537
} ;
534
538
match & mut set_result {
535
539
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 ) ?) ;
537
541
get_metadata_from_result ( Some ( & mut self . context ) , & mut resource_result. after_state , & mut metadata) ?;
538
542
} ,
539
543
SetResult :: Group ( group) => {
540
544
let mut results = Vec :: < Value > :: new ( ) ;
541
545
for result in group {
542
546
results. push ( serde_json:: to_value ( & result. result ) ?) ;
543
547
}
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 ( ) ) ) ;
545
549
} ,
546
550
}
547
551
let resource_result = config_result:: ResourceSetResult {
548
552
metadata : Some ( metadata) ,
549
- name : resource . name . clone ( ) ,
553
+ name : evaluated_name ,
550
554
resource_type : resource. resource_type . clone ( ) ,
551
555
result : set_result. clone ( ) ,
552
556
} ;
@@ -576,8 +580,10 @@ impl Configurator {
576
580
let mut progress = ProgressBar :: new ( resources. len ( ) as u64 , self . progress_format ) ?;
577
581
let discovery = & mut self . discovery . clone ( ) ;
578
582
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 ( ) ) ;
581
587
if self . skip_resource ( & resource) ? {
582
588
progress. write_increment ( 1 ) ;
583
589
continue ;
@@ -607,20 +613,20 @@ impl Configurator {
607
613
} ;
608
614
match & mut test_result {
609
615
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 ) ?) ;
611
617
get_metadata_from_result ( Some ( & mut self . context ) , & mut resource_test_result. actual_state , & mut metadata) ?;
612
618
} ,
613
619
TestResult :: Group ( group) => {
614
620
let mut results = Vec :: < Value > :: new ( ) ;
615
621
for result in group {
616
622
results. push ( serde_json:: to_value ( & result. result ) ?) ;
617
623
}
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 ( ) ) ) ;
619
625
} ,
620
626
}
621
627
let resource_result = config_result:: ResourceTestResult {
622
628
metadata : Some ( metadata) ,
623
- name : resource . name . clone ( ) ,
629
+ name : evaluated_name ,
624
630
resource_type : resource. resource_type . clone ( ) ,
625
631
result : test_result. clone ( ) ,
626
632
} ;
@@ -653,8 +659,10 @@ impl Configurator {
653
659
let resources = self . config . resources . clone ( ) ;
654
660
let discovery = & mut self . discovery . clone ( ) ;
655
661
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 ( ) ) ;
658
666
if self . skip_resource ( resource) ? {
659
667
progress. write_increment ( 1 ) ;
660
668
continue ;
@@ -673,7 +681,7 @@ impl Configurator {
673
681
return Err ( e) ;
674
682
} ,
675
683
} ;
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 ) ?) ;
677
685
progress. set_result ( & serde_json:: to_value ( export_result) ?) ;
678
686
progress. write_increment ( 1 ) ;
679
687
}
@@ -912,37 +920,35 @@ impl Configurator {
912
920
Ok ( ( ) )
913
921
}
914
922
915
- /// Process resource name expressions for non-copy resources .
923
+ /// Evaluate resource name expression and return the resolved name .
916
924
///
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
919
933
///
920
934
/// # Errors
921
935
///
922
936
/// This function will return an error if:
923
937
/// - Resource name expression evaluation fails
924
938
/// - Expression does not result in a string value
925
939
/// - 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 ( ) ) ;
942
944
}
943
945
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)
946
952
}
947
953
948
954
fn invoke_property_expressions ( & mut self , properties : Option < & Map < String , Value > > ) -> Result < Option < Map < String , Value > > , DscError > {
0 commit comments