Skip to content

Commit 884d861

Browse files
committed
use struct for from/to changes
1 parent 10a9fb8 commit 884d861

File tree

4 files changed

+34
-15
lines changed

4 files changed

+34
-15
lines changed

dsc/tests/dsc_whatif.tests.ps1

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ Describe 'whatif tests' {
3939
$result.results.Count | Should -Be 1
4040
$result.results[0].Name | Should -Be 'Registry'
4141
$result.results[0].type | Should -BeExactly 'Microsoft.Windows/Registry'
42-
$result.results[0].result.changes[0]._exist.from | Should -Be 'false'
43-
$result.results[0].result.changes[0]._exist.to | Should -Be 'true'
42+
$result.results[0].result.changes[0].name | Should -Be '_exist'
43+
$result.results[0].result.changes[0].from | Should -Be 'false'
44+
$result.results[0].result.changes[0].to | Should -Be 'true'
4445
$result.metadata.'Microsoft.DSC'.executionType | Should -BeExactly 'WhatIf'
4546
$LASTEXITCODE | Should -Be 0
4647
}
@@ -57,7 +58,7 @@ Describe 'whatif tests' {
5758
$result = $config_yaml | dsc config set -w --format pretty-json | ConvertFrom-Json
5859
$result.hadErrors | Should -BeFalse
5960
$result.results.Count | Should -Be 1
60-
$result.results[0].result.changes[0] | Should -Be "delete 'Test/Delete' using 'dsctest'"
61+
$result.results[0].result.changes | Should -Be "delete 'Test/Delete' using 'dsctest'"
6162
$LASTEXITCODE | Should -Be 0
6263
}
6364

dsc_lib/src/dscresources/command_resource.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
use jsonschema::JSONSchema;
55
use serde_json::Value;
66
use std::{collections::HashMap, env, io::{Read, Write}, process::{Command, Stdio}};
7-
use crate::{dscerror::DscError, dscresources::invoke_result::{ResourceGetResponse, ResourceSetResponse, ResourceSetWhatIfResponse, ResourceTestResponse}};
7+
use crate::{dscerror::DscError, dscresources::invoke_result::{ResourceGetResponse, ResourceSetResponse, ResourceSetWhatIfResponse, ResourceTestResponse, WhatIfResult}};
88
use crate::configure::{config_doc::ExecutionKind, config_result::ResourceGetResult};
99
use super::{dscresource::{get_diff, get_diff_what_if}, invoke_result::{ExportResult, GetResult, SetResult, TestResult, ValidateResult}, resource_manifest::{ArgKind, InputKind, Kind, ResourceManifest, ReturnKind, SchemaKind}};
1010
use tracing::{error, warn, info, debug, trace};
@@ -119,13 +119,13 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
119119
if in_desired_state {
120120
debug!("what-if: resource is already in desired state, returning null ResourceWhatIf response");
121121
return Ok(SetResult::ResourceWhatIf(ResourceSetWhatIfResponse{
122-
what_if_changes: Vec::new()
122+
what_if_changes: WhatIfResult::Diff(Vec::new())
123123
}));
124124
}
125125
debug!("what-if: resource is not in desired state, returning diff ResourceWhatIf response");
126126
let diff_properties = get_diff_what_if( &desired_state, &actual_state);
127127
return Ok(SetResult::ResourceWhatIf(ResourceSetWhatIfResponse{
128-
what_if_changes: vec![Value::from_iter(diff_properties)]
128+
what_if_changes: WhatIfResult::Diff(diff_properties)
129129
}));
130130
}
131131
if in_desired_state {
@@ -380,7 +380,7 @@ pub fn invoke_delete(resource: &ResourceManifest, cwd: &str, filter: &str, execu
380380

381381
if execution_type == &ExecutionKind::WhatIf {
382382
return Ok(Some(SetResult::ResourceWhatIf(ResourceSetWhatIfResponse{
383-
what_if_changes: vec![Value::String(format!("delete '{}' using '{}'", &resource.resource_type, &delete.executable))]
383+
what_if_changes: WhatIfResult::String(format!("delete '{}' using '{}'", &resource.resource_type, &delete.executable))
384384
})));
385385
}
386386
info!("Invoking delete '{}' using '{}'", &resource.resource_type, &delete.executable);

dsc_lib/src/dscresources/dscresource.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize};
88
use serde_json::Value;
99
use std::collections::HashMap;
1010

11-
use super::{command_resource, dscerror, invoke_result::{ExportResult, GetResult, ResourceTestResponse, SetResult, TestResult, ValidateResult}, resource_manifest::import_manifest};
11+
use super::{command_resource, dscerror, invoke_result::{ExportResult, GetResult, ResourceTestResponse, SetResult, TestResult, ValidateResult, WhatIfChanges}, resource_manifest::import_manifest};
1212

1313
#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema)]
1414
#[serde(deny_unknown_fields)]
@@ -358,8 +358,8 @@ pub fn get_diff(expected: &Value, actual: &Value) -> Vec<String> {
358358
}
359359

360360
#[must_use]
361-
pub fn get_diff_what_if(expected: &Value, actual: &Value) -> HashMap<String, Value> {
362-
let mut diff_properties: HashMap<String, Value> = HashMap::new();
361+
pub fn get_diff_what_if(expected: &Value, actual: &Value) -> Vec<WhatIfChanges> {
362+
let mut diff_properties: Vec<WhatIfChanges> = Vec::new();
363363
if expected.is_null() {
364364
return diff_properties;
365365
}
@@ -405,10 +405,13 @@ pub fn get_diff_what_if(expected: &Value, actual: &Value) -> HashMap<String, Val
405405
}
406406
}
407407
if is_diff {
408-
let mut temp_hashmap = HashMap::new();
409-
temp_hashmap.insert("to".to_string(), value.clone());
410-
temp_hashmap.insert("from".to_string(), actual[key].clone());
411-
diff_properties.insert(key.to_string(), Value::from_iter(temp_hashmap));
408+
diff_properties.push(
409+
WhatIfChanges {
410+
name: key.to_string(),
411+
from: actual[key].clone(),
412+
to: value.clone(),
413+
}
414+
);
412415
}
413416
}
414417
}

dsc_lib/src/dscresources/invoke_result.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,22 @@ pub struct ResourceSetResponse {
8888
#[serde(deny_unknown_fields)]
8989
pub struct ResourceSetWhatIfResponse {
9090
#[serde(rename = "changes")]
91-
pub what_if_changes: Vec<Value>
91+
pub what_if_changes: WhatIfResult
92+
}
93+
94+
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
95+
#[serde(untagged)]
96+
pub enum WhatIfResult {
97+
Diff(Vec<WhatIfChanges>),
98+
String(String)
99+
}
100+
101+
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
102+
#[serde(deny_unknown_fields)]
103+
pub struct WhatIfChanges {
104+
pub name: String,
105+
pub from: Value,
106+
pub to: Value
92107
}
93108

94109
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]

0 commit comments

Comments
 (0)