Skip to content

Commit c0a5a91

Browse files
committed
fix expected generation of resource id into helper function
1 parent 920da86 commit c0a5a91

File tree

3 files changed

+33
-27
lines changed

3 files changed

+33
-27
lines changed

lib/dsc-lib/src/configure/mod.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use crate::DscResource;
1515
use crate::discovery::Discovery;
1616
use crate::parser::Statement;
1717
use crate::progress::{Failure, ProgressBar, ProgressFormat};
18+
use crate::util::resource_id;
1819
use self::config_doc::{Configuration, DataType, MicrosoftDscMetadata, Operation, SecurityContextKind};
1920
use self::depends_on::get_resource_invocation_order;
2021
use self::config_result::{ConfigurationExportResult, ConfigurationGetResult, ConfigurationSetResult, ConfigurationTestResult};
@@ -388,15 +389,15 @@ impl Configurator {
388389

389390
match &mut get_result {
390391
GetResult::Resource(ref mut resource_result) => {
391-
self.context.references.insert(format!("{}:{}", resource.resource_type, evaluated_name), serde_json::to_value(&resource_result.actual_state)?);
392+
self.context.references.insert(resource_id(&resource.resource_type, &evaluated_name), serde_json::to_value(&resource_result.actual_state)?);
392393
get_metadata_from_result(Some(&mut self.context), &mut resource_result.actual_state, &mut metadata)?;
393394
},
394395
GetResult::Group(group) => {
395396
let mut results = Vec::<Value>::new();
396397
for result in group {
397398
results.push(serde_json::to_value(&result.result)?);
398399
}
399-
self.context.references.insert(format!("{}:{}", resource.resource_type, evaluated_name), Value::Array(results.clone()));
400+
self.context.references.insert(resource_id(&resource.resource_type, &evaluated_name), Value::Array(results.clone()));
400401
},
401402
}
402403
let resource_result = config_result::ResourceGetResult {
@@ -559,15 +560,15 @@ impl Configurator {
559560
};
560561
match &mut set_result {
561562
SetResult::Resource(resource_result) => {
562-
self.context.references.insert(format!("{}:{}", resource.resource_type, evaluated_name), serde_json::to_value(&resource_result.after_state)?);
563+
self.context.references.insert(resource_id(&resource.resource_type, &evaluated_name), serde_json::to_value(&resource_result.after_state)?);
563564
get_metadata_from_result(Some(&mut self.context), &mut resource_result.after_state, &mut metadata)?;
564565
},
565566
SetResult::Group(group) => {
566567
let mut results = Vec::<Value>::new();
567568
for result in group {
568569
results.push(serde_json::to_value(&result.result)?);
569570
}
570-
self.context.references.insert(format!("{}:{}", resource.resource_type, evaluated_name), Value::Array(results.clone()));
571+
self.context.references.insert(resource_id(&resource.resource_type, &evaluated_name), Value::Array(results.clone()));
571572
},
572573
}
573574
let resource_result = config_result::ResourceSetResult {
@@ -637,15 +638,15 @@ impl Configurator {
637638
};
638639
match &mut test_result {
639640
TestResult::Resource(resource_test_result) => {
640-
self.context.references.insert(format!("{}:{}", resource.resource_type, evaluated_name), serde_json::to_value(&resource_test_result.actual_state)?);
641+
self.context.references.insert(resource_id(&resource.resource_type, &evaluated_name), serde_json::to_value(&resource_test_result.actual_state)?);
641642
get_metadata_from_result(Some(&mut self.context), &mut resource_test_result.actual_state, &mut metadata)?;
642643
},
643644
TestResult::Group(group) => {
644645
let mut results = Vec::<Value>::new();
645646
for result in group {
646647
results.push(serde_json::to_value(&result.result)?);
647648
}
648-
self.context.references.insert(format!("{}:{}", resource.resource_type, evaluated_name), Value::Array(results.clone()));
649+
self.context.references.insert(resource_id(&resource.resource_type, &evaluated_name), Value::Array(results.clone()));
649650
},
650651
}
651652
let resource_result = config_result::ResourceTestResult {
@@ -707,7 +708,7 @@ impl Configurator {
707708
return Err(e);
708709
},
709710
};
710-
self.context.references.insert(format!("{}:{}", resource.resource_type, evaluated_name), serde_json::to_value(&export_result.actual_state)?);
711+
self.context.references.insert(resource_id(&resource.resource_type, &evaluated_name), serde_json::to_value(&export_result.actual_state)?);
711712
progress.set_result(&serde_json::to_value(export_result)?);
712713
progress.write_increment(1);
713714
}

lib/dsc-lib/src/functions/resource_id.rs

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
use crate::DscError;
55
use crate::configure::context::Context;
66
use crate::functions::{FunctionArgKind, Function, FunctionCategory, FunctionMetadata};
7+
use crate::util::resource_id;
78
use rust_i18n::t;
89
use serde_json::Value;
910

@@ -28,29 +29,15 @@ impl Function for ResourceId {
2829
}
2930

3031
fn invoke(&self, args: &[Value], _context: &Context) -> Result<Value, DscError> {
31-
let mut result = String::new();
3232
// first argument is the type and must contain only 1 slash
33-
let resource_type = &args[0];
34-
if let Some(value) = resource_type.as_str() {
35-
let slash_count = value.chars().filter(|c| *c == '/').count();
36-
if slash_count != 1 {
37-
return Err(DscError::Function("resourceId".to_string(), t!("functions.resourceId.incorrectTypeFormat").to_string()));
38-
}
39-
result.push_str(value);
40-
} else {
41-
return Err(DscError::Parser(t!("functions.resourceId.invalidFirstArgType").to_string()));
42-
}
43-
// ARM uses a slash separator, but here we use a colon which is not allowed for the type nor name
44-
result.push(':');
45-
// second argument is the name and we url encode it to ensure no unexpected characters are present
46-
let resource_name = &args[1];
47-
if let Some(value) = resource_name.as_str() {
48-
let encoded = urlencoding::encode(value);
49-
result.push_str(&encoded);
50-
} else {
51-
return Err(DscError::Parser(t!("functions.resourceId.invalidSecondArgType").to_string()));
33+
let resource_type = &args[0].as_str().unwrap();
34+
let slash_count = resource_type.chars().filter(|c| *c == '/').count();
35+
if slash_count != 1 {
36+
return Err(DscError::Function("resourceId".to_string(), t!("functions.resourceId.incorrectTypeFormat").to_string()));
5237
}
5338

39+
let resource_name = &args[1].as_str().unwrap();
40+
let result = resource_id(resource_type, resource_name);
5441
Ok(Value::String(result))
5542
}
5643
}

lib/dsc-lib/src/util.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,24 @@ fn get_settings_policy_file_path() -> String
213213
Path::new("/etc").join("dsc").join("dsc.settings.json").display().to_string()
214214
}
215215

216+
/// Generates a resource ID from the specified type and name.
217+
///
218+
/// # Arguments
219+
/// * `type_name` - The resource type in the format "namespace/type".
220+
/// * `name` - The resource name.
221+
///
222+
/// # Returns
223+
/// A string that holds the resource ID in the format "namespace/type:name".
224+
#[must_use]
225+
pub fn resource_id(type_name: &str, name: &str) -> String {
226+
let mut result = String::new();
227+
result.push_str(type_name);
228+
result.push(':');
229+
let encoded = urlencoding::encode(name);
230+
result.push_str(&encoded);
231+
result
232+
}
233+
216234
#[macro_export]
217235
macro_rules! locked_is_empty {
218236
($lockable:expr) => {{

0 commit comments

Comments
 (0)