Skip to content

Commit ea640f4

Browse files
committed
Fix no parsing expressions again when passed to an adapted resource
1 parent ac77397 commit ea640f4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+229
-197
lines changed

dsc_lib/locales/en-us.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ failedToParseEscapedStringLiteral = "Unable to parse escaped string literal"
442442
parsingEscapedStringLiteral = "Parsing escaped string literal: %{value}"
443443
parsingExpression = "Parsing expression"
444444
unknownExpressionType = "Unknown expression type: %{kind}"
445+
skippingExpressionProcessing = "Skipping expression processing"
445446

446447
[dscerror]
447448
adapterNotFound = "Adapter not found"

dsc_lib/src/configure/depends_on.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub fn get_resource_invocation_order(config: &Configuration, parser: &mut Statem
3535
let mut dependency_already_in_order = true;
3636
if let Some(depends_on) = resource.depends_on.clone() {
3737
for dependency in depends_on {
38-
let statement = parser.parse_and_execute(&dependency, context)?;
38+
let statement = parser.parse_and_execute(&dependency, context, true)?;
3939
let Some(string_result) = statement.as_str() else {
4040
return Err(DscError::Validation(t!("configure.dependsOn.syntaxIncorrect", dependency = dependency).to_string()));
4141
};
@@ -69,7 +69,7 @@ pub fn get_resource_invocation_order(config: &Configuration, parser: &mut Statem
6969
// check if the order has resource before its dependencies
7070
let resource_index = order.iter().position(|r| r.name == resource.name && r.resource_type == resource.resource_type).ok_or(DscError::Validation(t!("configure.dependsOn.resourceNotInOrder").to_string()))?;
7171
for dependency in depends_on {
72-
let statement = parser.parse_and_execute(dependency, context)?;
72+
let statement = parser.parse_and_execute(dependency, context, true)?;
7373
let Some(string_result) = statement.as_str() else {
7474
return Err(DscError::Validation(t!("configure.dependsOn.syntaxIncorrect", dependency = dependency).to_string()));
7575
};

dsc_lib/src/configure/mod.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ pub struct Configurator {
3939
discovery: Discovery,
4040
statement_parser: Statement,
4141
progress_format: ProgressFormat,
42+
pub process_expressions: bool,
4243
}
4344

4445
/// Add the results of an export operation to a configuration.
@@ -274,6 +275,7 @@ impl Configurator {
274275
discovery: discovery.clone(),
275276
statement_parser: Statement::new()?,
276277
progress_format,
278+
process_expressions: true,
277279
};
278280
config.validate_config()?;
279281
for extension in discovery.extensions.values() {
@@ -670,7 +672,7 @@ impl Configurator {
670672

671673
fn skip_resource(&mut self, resource: &Resource) -> Result<bool, DscError> {
672674
if let Some(condition) = &resource.condition {
673-
let condition_result = self.statement_parser.parse_and_execute(condition, &self.context)?;
675+
let condition_result = self.statement_parser.parse_and_execute(condition, &self.context, self.process_expressions)?;
674676
if condition_result != Value::Bool(true) {
675677
info!("{}", t!("configure.config_doc.skippingResource", name = resource.name, condition = condition, result = condition_result));
676678
return Ok(true);
@@ -722,7 +724,7 @@ impl Configurator {
722724
// default values can be expressions
723725
let value = if default_value.is_string() {
724726
if let Some(value) = default_value.as_str() {
725-
self.statement_parser.parse_and_execute(value, &self.context)?
727+
self.statement_parser.parse_and_execute(value, &self.context, self.process_expressions)?
726728
} else {
727729
return Err(DscError::Parser(t!("configure.mod.defaultStringNotDefined").to_string()));
728730
}
@@ -783,7 +785,7 @@ impl Configurator {
783785

784786
for (name, value) in variables {
785787
let new_value = if let Some(string) = value.as_str() {
786-
self.statement_parser.parse_and_execute(string, &self.context)?
788+
self.statement_parser.parse_and_execute(string, &self.context, self.process_expressions)?
787789
}
788790
else {
789791
value.clone()
@@ -887,7 +889,7 @@ impl Configurator {
887889
let Some(statement) = element.as_str() else {
888890
return Err(DscError::Parser(t!("configure.mod.arrayElementCouldNotTransformAsString").to_string()));
889891
};
890-
let statement_result = self.statement_parser.parse_and_execute(statement, &self.context)?;
892+
let statement_result = self.statement_parser.parse_and_execute(statement, &self.context, self.process_expressions)?;
891893
let Some(string_result) = statement_result.as_str() else {
892894
return Err(DscError::Parser(t!("configure.mod.arrayElementCouldNotTransformAsString").to_string()));
893895
};
@@ -905,7 +907,7 @@ impl Configurator {
905907
let Some(statement) = value.as_str() else {
906908
return Err(DscError::Parser(t!("configure.mod.valueCouldNotBeTransformedAsString", value = value).to_string()));
907909
};
908-
let statement_result = self.statement_parser.parse_and_execute(statement, &self.context)?;
910+
let statement_result = self.statement_parser.parse_and_execute(statement, &self.context, self.process_expressions)?;
909911
if let Some(string_result) = statement_result.as_str() {
910912
result.insert(name.clone(), Value::String(string_result.to_string()));
911913
} else {

dsc_lib/src/dscresources/dscresource.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ impl DscResource {
114114
};
115115
configuration.resources.push(adapter_resource);
116116
let config_json = serde_json::to_string(&configuration)?;
117-
let configurator = Configurator::new(&config_json, crate::progress::ProgressFormat::None)?;
117+
let mut configurator = Configurator::new(&config_json, crate::progress::ProgressFormat::None)?;
118+
// don't process expressions again as they would have already been processed before being passed to the adapter
119+
configurator.process_expressions = false;
118120
Ok(configurator)
119121
}
120122
}

dsc_lib/src/functions/add.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,36 +46,36 @@ mod tests {
4646
#[test]
4747
fn numbers() {
4848
let mut parser = Statement::new().unwrap();
49-
let result = parser.parse_and_execute("[add(2, 3)]", &Context::new()).unwrap();
49+
let result = parser.parse_and_execute("[add(2, 3)]", &Context::new(), true).unwrap();
5050
assert_eq!(result, 5);
5151
}
5252

5353
#[test]
5454
fn nested() {
5555
let mut parser = Statement::new().unwrap();
56-
let result = parser.parse_and_execute("[add(2, add(3, 4))]", &Context::new()).unwrap();
56+
let result = parser.parse_and_execute("[add(2, add(3, 4))]", &Context::new(), true).unwrap();
5757
assert_eq!(result, 9);
5858
}
5959

6060
#[test]
6161
fn invalid_one_parameter() {
6262
let mut parser = Statement::new().unwrap();
63-
let result = parser.parse_and_execute("[add(5)]", &Context::new());
63+
let result = parser.parse_and_execute("[add(5)]", &Context::new(), true);
6464
assert!(result.is_err());
6565
}
6666

6767
#[test]
6868
fn overflow_result() {
6969
let mut parser = Statement::new().unwrap();
7070
// max value for i64 is 2^63 -1 (or 9,223,372,036,854,775,807)
71-
let result = parser.parse_and_execute("[add(9223372036854775807, 2)]", &Context::new());
71+
let result = parser.parse_and_execute("[add(9223372036854775807, 2)]", &Context::new(), true);
7272
assert!(result.is_err());
7373
}
7474

7575
#[test]
7676
fn overflow_input() {
7777
let mut parser = Statement::new().unwrap();
78-
let result = parser.parse_and_execute("[add(9223372036854775808, 2)]", &Context::new());
78+
let result = parser.parse_and_execute("[add(9223372036854775808, 2)]", &Context::new(), true);
7979
assert!(result.is_err());
8080
}
8181
}

dsc_lib/src/functions/and.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,28 +51,28 @@ mod tests {
5151
#[test]
5252
fn two_values() {
5353
let mut parser = Statement::new().unwrap();
54-
let result = parser.parse_and_execute("[and(true, false)]", &Context::new()).unwrap();
54+
let result = parser.parse_and_execute("[and(true, false)]", &Context::new(), true).unwrap();
5555
assert_eq!(result, false);
5656
}
5757

5858
#[test]
5959
fn multiple_values() {
6060
let mut parser = Statement::new().unwrap();
61-
let result = parser.parse_and_execute("[and(true, false, true)]", &Context::new()).unwrap();
61+
let result = parser.parse_and_execute("[and(true, false, true)]", &Context::new(), true).unwrap();
6262
assert_eq!(result, false);
6363
}
6464

6565
#[test]
6666
fn all_false() {
6767
let mut parser = Statement::new().unwrap();
68-
let result = parser.parse_and_execute("[and(false, false)]", &Context::new()).unwrap();
68+
let result = parser.parse_and_execute("[and(false, false)]", &Context::new(), true).unwrap();
6969
assert_eq!(result, false);
7070
}
7171

7272
#[test]
7373
fn all_true() {
7474
let mut parser = Statement::new().unwrap();
75-
let result = parser.parse_and_execute("[and(true, true)]", &Context::new()).unwrap();
75+
let result = parser.parse_and_execute("[and(true, true)]", &Context::new(), true).unwrap();
7676
assert_eq!(result, true);
7777
}
7878
}

dsc_lib/src/functions/base64.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,21 @@ mod tests {
4040
#[test]
4141
fn strings() {
4242
let mut parser = Statement::new().unwrap();
43-
let result = parser.parse_and_execute("[base64('hello world')]", &Context::new()).unwrap();
43+
let result = parser.parse_and_execute("[base64('hello world')]", &Context::new(), true).unwrap();
4444
assert_eq!(result, "aGVsbG8gd29ybGQ=");
4545
}
4646

4747
#[test]
4848
fn numbers() {
4949
let mut parser = Statement::new().unwrap();
50-
let result = parser.parse_and_execute("[base64(123)]", &Context::new());
50+
let result = parser.parse_and_execute("[base64(123)]", &Context::new(), true);
5151
assert!(result.is_err());
5252
}
5353

5454
#[test]
5555
fn nested() {
5656
let mut parser = Statement::new().unwrap();
57-
let result = parser.parse_and_execute("[base64(base64('hello world'))]", &Context::new()).unwrap();
57+
let result = parser.parse_and_execute("[base64(base64('hello world'))]", &Context::new(), true).unwrap();
5858
assert_eq!(result, "YUdWc2JHOGdkMjl5YkdRPQ==");
5959
}
6060
}

dsc_lib/src/functions/bool.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,28 @@ mod tests {
4949
#[test]
5050
fn true_string() {
5151
let mut parser = Statement::new().unwrap();
52-
let result = parser.parse_and_execute("[bool('true')]", &Context::new()).unwrap();
52+
let result = parser.parse_and_execute("[bool('true')]", &Context::new(), true).unwrap();
5353
assert_eq!(result, true);
5454
}
5555

5656
#[test]
5757
fn false_string() {
5858
let mut parser = Statement::new().unwrap();
59-
let result = parser.parse_and_execute("[bool('false')]", &Context::new()).unwrap();
59+
let result = parser.parse_and_execute("[bool('false')]", &Context::new(), true).unwrap();
6060
assert_eq!(result, false);
6161
}
6262

6363
#[test]
6464
fn number_1() {
6565
let mut parser = Statement::new().unwrap();
66-
let result = parser.parse_and_execute("[bool(1)]", &Context::new()).unwrap();
66+
let result = parser.parse_and_execute("[bool(1)]", &Context::new(), true).unwrap();
6767
assert_eq!(result, true);
6868
}
6969

7070
#[test]
7171
fn number_0() {
7272
let mut parser = Statement::new().unwrap();
73-
let result = parser.parse_and_execute("[bool(0)]", &Context::new()).unwrap();
73+
let result = parser.parse_and_execute("[bool(0)]", &Context::new(), true).unwrap();
7474
assert_eq!(result, false);
7575
}
7676
}

dsc_lib/src/functions/coalesce.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,13 @@ mod tests {
150150
#[test]
151151
fn parser_with_values() {
152152
let mut parser = Statement::new().unwrap();
153-
let result = parser.parse_and_execute("[coalesce('hello', 'world')]", &Context::new()).unwrap();
153+
let result = parser.parse_and_execute("[coalesce('hello', 'world')]", &Context::new(), true).unwrap();
154154
assert_eq!(result, "hello");
155155

156-
let result = parser.parse_and_execute("[coalesce(42, 'fallback')]", &Context::new()).unwrap();
156+
let result = parser.parse_and_execute("[coalesce(42, 'fallback')]", &Context::new(), true).unwrap();
157157
assert_eq!(result, 42);
158158

159-
let result = parser.parse_and_execute("[coalesce(true)]", &Context::new()).unwrap();
159+
let result = parser.parse_and_execute("[coalesce(true)]", &Context::new(), true).unwrap();
160160
assert_eq!(result, true);
161161
}
162162
}

dsc_lib/src/functions/concat.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,56 +89,56 @@ mod tests {
8989
#[test]
9090
fn strings() {
9191
let mut parser = Statement::new().unwrap();
92-
let result = parser.parse_and_execute("[concat('a', 'b')]", &Context::new()).unwrap();
92+
let result = parser.parse_and_execute("[concat('a', 'b')]", &Context::new(), true).unwrap();
9393
assert_eq!(result, "ab");
9494
}
9595

9696
#[test]
9797
fn strings_with_spaces() {
9898
let mut parser = Statement::new().unwrap();
99-
let result = parser.parse_and_execute("[concat('a ', ' ', ' b')]", &Context::new()).unwrap();
99+
let result = parser.parse_and_execute("[concat('a ', ' ', ' b')]", &Context::new(), true).unwrap();
100100
assert_eq!(result, "a b");
101101
}
102102

103103
#[test]
104104
fn arrays() {
105105
let mut parser = Statement::new().unwrap();
106-
let result = parser.parse_and_execute("[concat(createArray('a','b'), createArray('c','d'))]", &Context::new()).unwrap();
106+
let result = parser.parse_and_execute("[concat(createArray('a','b'), createArray('c','d'))]", &Context::new(), true).unwrap();
107107
assert_eq!(result.to_string(), r#"["a","b","c","d"]"#);
108108
}
109109

110110
#[test]
111111
fn string_and_numbers() {
112112
let mut parser = Statement::new().unwrap();
113-
let result = parser.parse_and_execute("[concat('a', 1)]", &Context::new());
113+
let result = parser.parse_and_execute("[concat('a', 1)]", &Context::new(), true);
114114
assert!(result.is_err());
115115
}
116116

117117
#[test]
118118
fn nested() {
119119
let mut parser = Statement::new().unwrap();
120-
let result = parser.parse_and_execute("[concat('a', concat('b', 'c'), 'd')]", &Context::new()).unwrap();
120+
let result = parser.parse_and_execute("[concat('a', concat('b', 'c'), 'd')]", &Context::new(), true).unwrap();
121121
assert_eq!(result, "abcd");
122122
}
123123

124124
#[test]
125125
fn invalid_one_parameter() {
126126
let mut parser = Statement::new().unwrap();
127-
let result = parser.parse_and_execute("[concat('a')]", &Context::new());
127+
let result = parser.parse_and_execute("[concat('a')]", &Context::new(), true);
128128
assert!(result.is_err());
129129
}
130130

131131
#[test]
132132
fn string_and_array() {
133133
let mut parser = Statement::new().unwrap();
134-
let result = parser.parse_and_execute("[concat('a', createArray('b','c'))]", &Context::new());
134+
let result = parser.parse_and_execute("[concat('a', createArray('b','c'))]", &Context::new(), true);
135135
assert!(result.is_err());
136136
}
137137

138138
#[test]
139139
fn array_and_string() {
140140
let mut parser = Statement::new().unwrap();
141-
let result = parser.parse_and_execute("[concat(createArray('a','b'), 'c')]", &Context::new());
141+
let result = parser.parse_and_execute("[concat(createArray('a','b'), 'c')]", &Context::new(), true);
142142
assert!(result.is_err());
143143
}
144144
}

0 commit comments

Comments
 (0)