Skip to content

Commit f1c2bf9

Browse files
StartAutomatingStartAutomating
authored andcommitted
New-PipeScript: Allowing -Parameter dictionary values to be dictionaries or PSObjects (Fixes #311)
1 parent 36633b2 commit f1c2bf9

1 file changed

Lines changed: 67 additions & 1 deletion

File tree

New-PipeScript.ps1

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ HTTP Accept.
1313
HTTP Accept indicates what content types the web request will accept as a response.
1414
'
1515
}
16+
.EXAMPLE
17+
New-PipeScript -Parameter @{"bar"=@{
18+
Name = "foo"
19+
Help = 'Foobar'
20+
Attributes = "Mandatory","ValueFromPipelineByPropertyName"
21+
Aliases = "fubar"
22+
Type = "string"
23+
}}
1624
#>
1725
[Alias('New-ScriptBlock')]
1826
param(
@@ -265,7 +273,7 @@ HTTP Accept indicates what content types the web request will accept as a respon
265273
elseif ($EachParameter.Value -is [string]) {
266274
# embed it directly.
267275
$ParametersToCreate[$EachParameter.Key] = $EachParameter.Value
268-
}
276+
}
269277
# If the value is a ScriptBlock
270278
elseif ($EachParameter.Value -is [ScriptBlock]) {
271279
# Embed it
@@ -289,6 +297,64 @@ HTTP Accept indicates what content types the web request will accept as a respon
289297
$ParametersToCreate[$EachParameter.Key] = # join it's elements by newlines
290298
$EachParameter.Value -join [Environment]::Newline
291299
}
300+
elseif ($EachParameter.Value -is [Collections.IDictionary] -or
301+
$EachParameter.Value -is [PSObject]) {
302+
$parameterMetadata = $EachParameter.Value
303+
$parameterName = $EachParameter.Key
304+
if ($parameterMetadata.Name) {
305+
$parameterName = $parameterMetadata.Name
306+
}
307+
308+
$parameterAttributeParts = @()
309+
$ParameterOtherAttributes = @()
310+
$attrs =
311+
if ($parameterMetadata.Attributes) { $parameterMetadata.Attributes }
312+
elseif ($parameterMetadata.Attribute) { $parameterMetadata.Attribute }
313+
$aliases =
314+
if ($parameterMetadata.Alias) { $parameterMetadata.Alias }
315+
elseif ($parameterMetadata.Aliases) { $parameterMetadata.Aliases }
316+
$parameterHelp =
317+
if ($parameterMetadata.Help) { $parameterMetadata.Help}
318+
$aliasAttribute = @(foreach ($alias in $aliases) {
319+
$alias -replace "'","''"
320+
}) -join "','"
321+
if ($aliasAttribute) {
322+
$aliasAttribute = "[Alias('$aliasAttribute')]"
323+
}
324+
325+
foreach ($attr in $attrs) {
326+
if ($attr -notmatch '^\[') {
327+
$parameterAttributeParts += $attr
328+
} else {
329+
$ParameterOtherAttributes += $attr
330+
}
331+
}
332+
$parameterType =
333+
if ($parameterMetadata.Type) {$parameterMetadata.Type }
334+
elseif ($parameterMetadata.ParameterType) {$parameterMetadata.ParameterType }
335+
$ParametersToCreate[$parameterName] = @(
336+
if ($ParameterHelp) {
337+
$ParameterHelp | embedParameterHelp
338+
}
339+
if ($parameterAttributeParts) {
340+
"[Parameter($($parameterAttributeParts -join ','))]"
341+
}
342+
if ($aliasAttribute) {
343+
$aliasAttribute
344+
}
345+
if ($parameterType -as [type]) {
346+
"[$(($parameterType -as [type]).FullName -replace '^System\.')]"
347+
}
348+
elseif ($parameterType) {
349+
"[PSTypeName('$($parameterType -replace '^System\.')')]"
350+
}
351+
352+
if ($ParameterOtherAttributes) {
353+
$ParameterOtherAttributes
354+
}
355+
'$' + ($parameterName -replace '^$')
356+
) -join [Environment]::newLine
357+
}
292358
}
293359
}
294360
# If the parameter was a string

0 commit comments

Comments
 (0)