@@ -7,42 +7,147 @@ function Resolve-ProcessParameter {
77 $name = $Node.name
88 $type = $Node.type
99 $store = $Node.store
10- $pattern = $Node.pattern # New for JSON format
10+
11+ $pattern = $Node.pattern
12+
1113 $condition = $Node.condition
1214
13- $default = Resolve-AttributeValue $Node.default (GetErrorLocationParameterAttrVal $name default )
15+ $default = Resolve-AttributeValue $Node.default (Get-ErrorLocationParameterAttrVal $name default )
1416
15- # Enhanced condition evaluation with JSON support
16- if ($condition -and ! (EvaluateConditionAttribute $condition " '<$ ( $Node.LocalName ) >'" )) {
17+ if ($condition -and ! (Test-ConditionAttribute $condition " '<$ ( $Node.LocalName ) >'" )) {
1718 if (-not [string ]::IsNullOrEmpty($default ) -and $type -eq ' text' ) {
1819 Set-PlasterVariable - Name $name - Value $default - IsParam $true
19- $PSCmdlet.WriteDebug (" Parameter $ ( $name ) condition false, using default: $ default" )
20+ $PSCmdlet.WriteDebug (" The condition of the parameter $ ( $name ) with the type 'text' evaluated to false. The parameter has a default value which will be used. " )
2021 } else {
22+ # Define the parameter so later conditions can use it but its value will be $null
2123 Set-PlasterVariable - Name $name - Value $null - IsParam $true
2224 $PSCmdlet.WriteDebug (" Skipping parameter $ ( $name ) , condition evaluated to false." )
2325 }
26+
2427 return
2528 }
2629
27- $prompt = Resolve-AttributeValue $Node.prompt (GetErrorLocationParameterAttrVal $name prompt)
30+ $prompt = Resolve-AttributeValue $Node.prompt (Get-ErrorLocationParameterAttrVal $name prompt)
2831
29- # Check for dynamic parameter value
30- if ($boundParameters.ContainsKey ($name )) {
31- $value = $boundParameters [$name ]
32+ # Check if parameter was provided via a dynamic parameter.
33+ if ($script :boundParameters.ContainsKey ($name )) {
34+ $value = $script :boundParameters [$name ]
35+ } else {
36+ # Not a dynamic parameter so prompt user for the value but first check for a stored default value.
37+ if ($store -and ($null -ne $script :defaultValueStore [$name ])) {
38+ $default = $script :defaultValueStore [$name ]
39+ $PSCmdlet.WriteDebug (" Read default value '$default ' for parameter '$name ' from default value store." )
3240
33- # Enhanced validation for JSON parameters
34- if ($pattern -and $type -eq ' text' -and $value -notmatch $pattern ) {
35- $validationMessage = if ($Node.validationMessage ) { $Node.validationMessage } else { " Value does not match required pattern: $pattern " }
36- throw " Parameter '$name ' validation failed: $validationMessage "
41+ if (($store -eq ' encrypted' ) -and ($default -is [System.Security.SecureString ])) {
42+ try {
43+ $cred = New-Object - TypeName PSCredential - ArgumentList ' jsbplh' , $default
44+ $default = $cred.GetNetworkCredential ().Password
45+ $PSCmdlet.WriteDebug (" Unencrypted default value for parameter '$name '." )
46+ } catch [System.Exception ] {
47+ Write-Warning ($LocalizedData.ErrorUnencryptingSecureString_F1 -f $name )
48+ }
49+ }
3750 }
3851
39- Write-PlasterLog - Level Debug - Message " Using dynamic parameter value for '$name ': $value "
40- } else {
41- # Interactive parameter collection with enhanced validation
42- # ... (rest of parameter processing logic)
52+ # If the prompt message failed to evaluate or was empty, supply a diagnostic prompt message
53+ if (! $prompt ) {
54+ $prompt = $LocalizedData.MissingParameterPrompt_F1 -f $name
55+ }
56+
57+ # Some default values might not come from the template e.g. some are harvested from .gitconfig if it exists.
58+ $defaultNotFromTemplate = $false
59+
60+ $splat = @ {}
61+
62+ if ($null -ne $pattern ) {
63+ $splat.Add (' pattern' , $pattern )
64+ }
65+
66+ # Now prompt user for parameter value based on the parameter type.
67+ switch - regex ($type ) {
68+ ' text' {
69+ # Display an appropriate "default" value in the prompt string.
70+ if ($default ) {
71+ if ($store -eq ' encrypted' ) {
72+ $obscuredDefault = $default -replace ' (....).*' , ' $1****'
73+ $prompt += " ($obscuredDefault )"
74+ } else {
75+ $prompt += " ($default )"
76+ }
77+ }
78+ # Prompt the user for text input.
79+ $value = Read-PromptForInput $prompt $default @splat
80+ $valueToStore = $value
81+ }
82+ ' user-fullname' {
83+ # If no default, try to get a name from git config.
84+ if (! $default ) {
85+ $default = Get-GitConfigValue (' name' )
86+ $defaultNotFromTemplate = $true
87+ }
88+
89+ if ($default ) {
90+ if ($store -eq ' encrypted' ) {
91+ $obscuredDefault = $default -replace ' (....).*' , ' $1****'
92+ $prompt += " ($obscuredDefault )"
93+ } else {
94+ $prompt += " ($default )"
95+ }
96+ }
97+
98+ # Prompt the user for text input.
99+ $value = Read-PromptForInput $prompt $default @splat
100+ $valueToStore = $value
101+ }
102+ ' user-email' {
103+ # If no default, try to get an email from git config
104+ if (-not $default ) {
105+ $default = Get-GitConfigValue (' email' )
106+ $defaultNotFromTemplate = $true
107+ }
108+
109+ if ($default ) {
110+ if ($store -eq ' encrypted' ) {
111+ $obscuredDefault = $default -replace ' (....).*' , ' $1****'
112+ $prompt += " ($obscuredDefault )"
113+ } else {
114+ $prompt += " ($default )"
115+ }
116+ }
117+
118+ # Prompt the user for text input.
119+ $value = Read-PromptForInput $prompt $default @splat
120+ $valueToStore = $value
121+ }
122+ ' choice|multichoice' {
123+ $choices = $Node.ChildNodes
124+ $defaults = [int []]($default -split ' ,' )
125+
126+ # Prompt the user for choice or multichoice selection input.
127+ $selections = Read-PromptForChoice $name $choices $prompt $defaults - IsMultiChoice:($type -eq ' multichoice' )
128+ $value = $selections.Values
129+ $OFS = " ,"
130+ $valueToStore = " $ ( $selections.Indices ) "
131+ }
132+ default { throw ($LocalizedData.UnrecognizedParameterType_F2 -f $type , $Node.LocalName ) }
133+ }
134+
135+ # If parameter specifies that user's input be stored as the default value,
136+ # store it to file if the value has changed.
137+ if ($store -and (($default -ne $valueToStore ) -or $defaultNotFromTemplate )) {
138+ if ($store -eq ' encrypted' ) {
139+ $PSCmdlet.WriteDebug (" Storing new, encrypted default value for parameter '$name ' to default value store." )
140+ $script :defaultValueStore [$name ] = ConvertTo-SecureString - String $valueToStore - AsPlainText - Force
141+ } else {
142+ $PSCmdlet.WriteDebug (" Storing new default value '$valueToStore ' for parameter '$name ' to default value store." )
143+ $script :defaultValueStore [$name ] = $valueToStore
144+ }
145+
146+ $script :flags.DefaultValueStoreDirty = $true
147+ }
43148 }
44149
45- # Make template defined parameters available as PowerShell variables
150+ # Make template defined parameters available as a PowerShell variable PLASTER_PARAM_<parameterName>.
46151 Set-PlasterVariable - Name $name - Value $value - IsParam $true
47152 Write-PlasterLog - Level Debug - Message " Set parameter variable: PLASTER_PARAM_$name = $value "
48153}
0 commit comments