Skip to content

Commit 36633b2

Browse files
author
James Brundage
committed
New-PipeScript: Allowing -Parameter dictionary values to be dictionaries or PSObjects (Fixes #311)
1 parent 2340489 commit 36633b2

1 file changed

Lines changed: 74 additions & 1 deletion

File tree

New-PipeScript.ps1.ps1

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ HTTP Accept.
1515
HTTP Accept indicates what content types the web request will accept as a response.
1616
'
1717
}
18+
.EXAMPLE
19+
New-PipeScript -Parameter @{"bar"=@{
20+
Name = "foo"
21+
Help = 'Foobar'
22+
Attributes = "Mandatory","ValueFromPipelineByPropertyName"
23+
Aliases = "fubar"
24+
Type = "string"
25+
}}
1826
#>
1927
[Alias('New-ScriptBlock')]
2028
param(
@@ -228,7 +236,7 @@ HTTP Accept indicates what content types the web request will accept as a respon
228236
elseif ($EachParameter.Value -is [string]) {
229237
# embed it directly.
230238
$ParametersToCreate[$EachParameter.Key] = $EachParameter.Value
231-
}
239+
}
232240
# If the value is a ScriptBlock
233241
elseif ($EachParameter.Value -is [ScriptBlock]) {
234242
# Embed it
@@ -252,6 +260,71 @@ HTTP Accept indicates what content types the web request will accept as a respon
252260
$ParametersToCreate[$EachParameter.Key] = # join it's elements by newlines
253261
$EachParameter.Value -join [Environment]::Newline
254262
}
263+
elseif ($EachParameter.Value -is [Collections.IDictionary] -or
264+
$EachParameter.Value -is [PSObject]) {
265+
$parameterMetadata = $EachParameter.Value
266+
$parameterName = $EachParameter.Key
267+
if ($parameterMetadata.Name) {
268+
$parameterName = $parameterMetadata.Name
269+
}
270+
271+
$parameterAttributeParts = @()
272+
$ParameterOtherAttributes = @()
273+
$attrs =
274+
if ($parameterMetadata.Attributes) { $parameterMetadata.Attributes }
275+
elseif ($parameterMetadata.Attribute) { $parameterMetadata.Attribute }
276+
277+
$aliases =
278+
if ($parameterMetadata.Alias) { $parameterMetadata.Alias }
279+
elseif ($parameterMetadata.Aliases) { $parameterMetadata.Aliases }
280+
281+
$parameterHelp =
282+
if ($parameterMetadata.Help) { $parameterMetadata.Help}
283+
284+
$aliasAttribute = @(foreach ($alias in $aliases) {
285+
$alias -replace "'","''"
286+
}) -join "','"
287+
288+
if ($aliasAttribute) {
289+
$aliasAttribute = "[Alias('$aliasAttribute')]"
290+
}
291+
292+
foreach ($attr in $attrs) {
293+
if ($attr -notmatch '^\[') {
294+
$parameterAttributeParts += $attr
295+
} else {
296+
$ParameterOtherAttributes += $attr
297+
}
298+
}
299+
300+
$parameterType =
301+
if ($parameterMetadata.Type) {$parameterMetadata.Type }
302+
elseif ($parameterMetadata.ParameterType) {$parameterMetadata.ParameterType }
303+
304+
$ParametersToCreate[$parameterName] = @(
305+
if ($ParameterHelp) {
306+
$ParameterHelp | embedParameterHelp
307+
}
308+
if ($parameterAttributeParts) {
309+
"[Parameter($($parameterAttributeParts -join ','))]"
310+
}
311+
if ($aliasAttribute) {
312+
$aliasAttribute
313+
}
314+
if ($parameterType -as [type]) {
315+
"[$(($parameterType -as [type]).FullName -replace '^System\.')]"
316+
}
317+
elseif ($parameterType) {
318+
"[PSTypeName('$($parameterType -replace '^System\.')')]"
319+
}
320+
321+
if ($ParameterOtherAttributes) {
322+
$ParameterOtherAttributes
323+
}
324+
325+
'$' + ($parameterName -replace '^$')
326+
) -join [Environment]::newLine
327+
}
255328
}
256329

257330
}

0 commit comments

Comments
 (0)