Private/ConvertTo-PstParameterDefinition.ps1

function ConvertTo-PstParameterDefinition {
    <#
    .SYNOPSIS
        Normalizes parameter input from string or hashtable to standard format.

    .DESCRIPTION
        Accepts parameter definitions as simple strings or detailed hashtables
        and converts them to a standardized hashtable format for code generation.

    .PARAMETER ParameterInput
        Single parameter as string or hashtable, or array of parameters.

    .EXAMPLE
        ConvertTo-PstParameterDefinition -ParameterInput "UserId"
        Converts simple string to hashtable with defaults.

    .EXAMPLE
        ConvertTo-PstParameterDefinition -ParameterInput @{Name="UserId"; Type="string"; Mandatory=$true}
        Passes through detailed hashtable with validation.

    .NOTES
        Version: 1.0
        Author: numidia
        Creation Date: 2025-12-01
        Purpose: Normalize parameter input for code generators
    #>

    [CmdletBinding()]
    [OutputType([hashtable[]])]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [AllowEmptyCollection()]
        $ParameterInput
    )

    begin {
        Write-Debug "Begin '$($MyInvocation.MyCommand.Name)' at '$(Get-Date)'"
        $normalizedParams = [System.Collections.ArrayList]::new()
    }

    process {
        try {
            # Handle null or empty
            if ($null -eq $ParameterInput -or ($ParameterInput -is [array] -and $ParameterInput.Count -eq 0)) {
                Write-Verbose "No parameters provided"
                return @()
            }

            # Ensure array
            $params = if ($ParameterInput -is [array]) { $ParameterInput } else { @($ParameterInput) }

            foreach ($param in $params) {
                if ($param -is [string]) {
                    # Simple string - convert to hashtable with defaults
                    $normalized = @{
                        Name = $param
                        Type = 'string'
                        Mandatory = $false
                        Pipeline = $false
                        Position = $null
                        HelpMessage = ''
                        Validation = @()
                        DefaultValue = $null
                    }
                    Write-Verbose "Normalized string parameter '$param' to hashtable"
                }
                elseif ($param -is [hashtable]) {
                    # Hashtable - validate and fill defaults
                    if (-not $param.ContainsKey('Name')) {
                        throw "Parameter hashtable must contain 'Name' key"
                    }

                    $normalized = @{
                        Name = $param.Name
                        Type = if ($param.ContainsKey('Type')) { $param.Type } else { 'string' }
                        Mandatory = if ($param.ContainsKey('Mandatory')) { $param.Mandatory } else { $false }
                        Pipeline = if ($param.ContainsKey('Pipeline')) { $param.Pipeline } else { $false }
                        Position = if ($param.ContainsKey('Position')) { $param.Position } else { $null }
                        HelpMessage = if ($param.ContainsKey('HelpMessage')) { $param.HelpMessage } else { '' }
                        Validation = if ($param.ContainsKey('Validation')) { $param.Validation } else { @() }
                        ValidationSet = if ($param.ContainsKey('ValidationSet')) { $param.ValidationSet } else { $null }
                        DefaultValue = if ($param.ContainsKey('DefaultValue')) { $param.DefaultValue } else { $null }
                    }
                    Write-Verbose "Normalized hashtable parameter '$($param.Name)'"
                }
                else {
                    throw "Parameter must be string or hashtable, got: $($param.GetType().Name)"
                }

                [void]$normalizedParams.Add($normalized)
            }
        }
        catch {
            Write-Error "Failed to normalize parameter: $($_.Exception.Message)"
            $PSCmdlet.ThrowTerminatingError($_)
        }
    }

    end {
        Write-Debug "End '$($MyInvocation.MyCommand.Name)' at '$(Get-Date)'"
        return $normalizedParams.ToArray()
    }
}