Skip to content

Commit c023b2d

Browse files
committed
Attempt to resolve feedback Steve
1 parent 6420267 commit c023b2d

File tree

2 files changed

+45
-45
lines changed

2 files changed

+45
-45
lines changed

dsc/src/subcommand.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -381,12 +381,6 @@ pub fn config(subcommand: &ConfigSubCommand, parameters: &Option<String>, parame
381381
exit(EXIT_INVALID_INPUT);
382382
}
383383

384-
// process resource names after parameters are available
385-
if let Err(err) = configurator.process_resource_names() {
386-
error!("Error processing resource names: {err}");
387-
exit(EXIT_DSC_ERROR);
388-
}
389-
390384
match subcommand {
391385
ConfigSubCommand::Get { output_format, .. } => {
392386
config_get(&mut configurator, output_format.as_ref(), as_group);

dsc_lib/src/configure/mod.rs

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)