Skip to content

Commit 0574565

Browse files
authored
Add support for Hashtable syntax of Import-DscRessource for -SaveDscDependency switch (#1138)
1 parent dff9522 commit 0574565

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

Engine/Generic/ModuleDependencyHandler.cs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -461,24 +461,38 @@ public static IEnumerable<string> GetModuleNameFromErrorExtent(ParseError error,
461461
var paramValAst = dynamicKywdAst.CommandElements[positionOfModuleNameParamter];
462462

463463
// import-dscresource -ModuleName module1
464-
var paramValStrConstExprAst = paramValAst as StringConstantExpressionAst;
465-
if (paramValStrConstExprAst != null)
464+
if (paramValAst is StringConstantExpressionAst paramValStrConstExprAst)
466465
{
467466
modules.Add(paramValStrConstExprAst.Value);
468467

469468
// import-dscresource -ModuleName module1 -ModuleVersion major.minor.patch.build
470469
var versionParameterAst = dynamicKywdAst.CommandElements[positionOfModuleVersionParameter] as StringConstantExpressionAst;
471470
if (versionParameterAst != null)
472471
{
473-
Version.TryParse(versionParameterAst.Value, out Version version); // ignore return value since a module version of null means no version
474-
moduleVersion = version;
472+
Version.TryParse(versionParameterAst.Value, out moduleVersion); // ignore return value since a module version of null means no version
475473
}
476474
return modules;
477475
}
478-
476+
477+
// Import-DscResource –ModuleName @{ModuleName="module1";ModuleVersion="1.2.3.4"}
478+
//var paramValAstHashtableAst = paramValAst.Find(oneAst => oneAst is HashtableAst, true) as HashtableAst;
479+
if (paramValAst.Find(oneAst => oneAst is HashtableAst, true) is HashtableAst paramValAstHashtableAst)
480+
{
481+
var moduleNameTuple = paramValAstHashtableAst.KeyValuePairs.SingleOrDefault(x => x.Item1.Extent.Text.Equals("ModuleName"));
482+
var moduleName = moduleNameTuple.Item2.Find(astt => astt is StringConstantExpressionAst, true) as StringConstantExpressionAst;
483+
if (moduleName == null)
484+
{
485+
return null;
486+
}
487+
modules.Add(moduleName.Value);
488+
var moduleVersionTuple = paramValAstHashtableAst.KeyValuePairs.SingleOrDefault(x => x.Item1.Extent.Text.Equals("ModuleVersion"));
489+
var moduleVersionAst = moduleVersionTuple.Item2.Find(astt => astt is StringConstantExpressionAst, true) as StringConstantExpressionAst;
490+
Version.TryParse(moduleVersionAst.Value, out moduleVersion);
491+
return modules;
492+
}
493+
479494
// import-dscresource -ModuleName module1,module2
480-
var paramValArrLtrlAst = paramValAst as ArrayLiteralAst;
481-
if (paramValArrLtrlAst != null)
495+
if (paramValAst is ArrayLiteralAst paramValArrLtrlAst)
482496
{
483497
foreach (var elem in paramValArrLtrlAst.Elements)
484498
{

Tests/Engine/ModuleDependencyHandler.tests.ps1

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,22 @@ Describe "Resolve DSC Resource Dependency" {
105105
$moduleVersion | Should -Be ([version]'1.2.3.4')
106106
}
107107

108+
It "Extracts 1 module name with version using HashTable syntax" -skip:$skipTest {
109+
$sb = @"
110+
{Configuration SomeConfiguration
111+
{
112+
Import-DscResource -ModuleName (@{ModuleName="SomeDscModule1";ModuleVersion="1.2.3.4"})
113+
}}
114+
"@
115+
$tokens = $null
116+
$parseError = $null
117+
$ast = [System.Management.Automation.Language.Parser]::ParseInput($sb, [ref]$tokens, [ref]$parseError)
118+
$moduleVersion = $null
119+
$resultModuleNames = $moduleHandlerType::GetModuleNameFromErrorExtent($parseError[0], $ast, [ref]$moduleVersion).ToArray()
120+
$resultModuleNames[0] | Should -Be 'SomeDscModule1'
121+
$moduleVersion | Should -Be ([version]'1.2.3.4')
122+
}
123+
108124
It "Extracts more than 1 module names" -skip:$skipTest {
109125
$sb = @"
110126
{Configuration SomeConfiguration

0 commit comments

Comments
 (0)