Skip to content

Commit d6a4cb2

Browse files
committed
Fix no parsing expressions again when passed to an adapted resource
1 parent 751b908 commit d6a4cb2

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
@@ -441,6 +441,7 @@ failedToParseEscapedStringLiteral = "Unable to parse escaped string literal"
441441
parsingEscapedStringLiteral = "Parsing escaped string literal: %{value}"
442442
parsingExpression = "Parsing expression"
443443
unknownExpressionType = "Unknown expression type: %{kind}"
444+
skippingExpressionProcessing = "Skipping expression processing"
444445

445446
[dscerror]
446447
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
@@ -50,36 +50,36 @@ mod tests {
5050
#[test]
5151
fn numbers() {
5252
let mut parser = Statement::new().unwrap();
53-
let result = parser.parse_and_execute("[add(2, 3)]", &Context::new()).unwrap();
53+
let result = parser.parse_and_execute("[add(2, 3)]", &Context::new(), true).unwrap();
5454
assert_eq!(result, 5);
5555
}
5656

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

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

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

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

dsc_lib/src/functions/and.rs

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

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

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

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

dsc_lib/src/functions/base64.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,21 @@ mod tests {
4747
#[test]
4848
fn strings() {
4949
let mut parser = Statement::new().unwrap();
50-
let result = parser.parse_and_execute("[base64('hello world')]", &Context::new()).unwrap();
50+
let result = parser.parse_and_execute("[base64('hello world')]", &Context::new(), true).unwrap();
5151
assert_eq!(result, "aGVsbG8gd29ybGQ=");
5252
}
5353

5454
#[test]
5555
fn numbers() {
5656
let mut parser = Statement::new().unwrap();
57-
let result = parser.parse_and_execute("[base64(123)]", &Context::new());
57+
let result = parser.parse_and_execute("[base64(123)]", &Context::new(), true);
5858
assert!(result.is_err());
5959
}
6060

6161
#[test]
6262
fn nested() {
6363
let mut parser = Statement::new().unwrap();
64-
let result = parser.parse_and_execute("[base64(base64('hello world'))]", &Context::new()).unwrap();
64+
let result = parser.parse_and_execute("[base64(base64('hello world'))]", &Context::new(), true).unwrap();
6565
assert_eq!(result, "YUdWc2JHOGdkMjl5YkdRPQ==");
6666
}
6767
}

dsc_lib/src/functions/bool.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,28 +56,28 @@ mod tests {
5656
#[test]
5757
fn true_string() {
5858
let mut parser = Statement::new().unwrap();
59-
let result = parser.parse_and_execute("[bool('true')]", &Context::new()).unwrap();
59+
let result = parser.parse_and_execute("[bool('true')]", &Context::new(), true).unwrap();
6060
assert_eq!(result, true);
6161
}
6262

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

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

7777
#[test]
7878
fn number_0() {
7979
let mut parser = Statement::new().unwrap();
80-
let result = parser.parse_and_execute("[bool(0)]", &Context::new()).unwrap();
80+
let result = parser.parse_and_execute("[bool(0)]", &Context::new(), true).unwrap();
8181
assert_eq!(result, false);
8282
}
8383
}

dsc_lib/src/functions/coalesce.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,13 @@ mod tests {
142142
#[test]
143143
fn parser_with_values() {
144144
let mut parser = Statement::new().unwrap();
145-
let result = parser.parse_and_execute("[coalesce('hello', 'world')]", &Context::new()).unwrap();
145+
let result = parser.parse_and_execute("[coalesce('hello', 'world')]", &Context::new(), true).unwrap();
146146
assert_eq!(result, "hello");
147147

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

151-
let result = parser.parse_and_execute("[coalesce(true)]", &Context::new()).unwrap();
151+
let result = parser.parse_and_execute("[coalesce(true)]", &Context::new(), true).unwrap();
152152
assert_eq!(result, true);
153153
}
154154
}

dsc_lib/src/functions/concat.rs

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

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

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

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

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

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

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

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

0 commit comments

Comments
 (0)