Private/Document/ConvertTo-OpenApiResponseList.ps1
|
function ConvertTo-OpenApiResponseList { <# .SYNOPSIS Normalises a raw 'responses' map into [ { StatusCode, Description, Content, Headers } ] in document order. .DESCRIPTION Response and header $refs are resolved. Range codes are upper-cased ('2xx' -> '2XX'). Headers is a map of header name to { Description, Required, Deprecated, Schema }. #> [CmdletBinding()] [OutputType([object[]])] param( [Parameter(Mandatory)] [pscustomobject]$Context, [Parameter(Mandatory)] [AllowNull()] [object]$Responses, [Parameter(Mandatory)] [AllowEmptyString()] [string]$Pointer ) $list = [System.Collections.Generic.List[object]]::new() if ($Responses -isnot [System.Collections.IDictionary]) { return , $list.ToArray() } foreach ($code in @($Responses.Keys)) { $resolved = Resolve-OpenApiComponentReference -Context $Context -Node $Responses[$code] -Pointer (Join-OpenApiJsonPointer -Pointer $Pointer -Segment $code) if ($null -eq $resolved -or $resolved.Node -isnot [System.Collections.IDictionary]) { continue } $response = $resolved.Node $statusCode = [string]$code if ($statusCode -match '^[1-5]xx$') { $statusCode = $statusCode.ToUpperInvariant() } $headers = [System.Collections.Specialized.OrderedDictionary]::new([System.StringComparer]::Ordinal) if ($response['headers'] -is [System.Collections.IDictionary]) { foreach ($name in @($response['headers'].Keys)) { $header = Resolve-OpenApiComponentReference -Context $Context -Node $response['headers'][$name] -Pointer (Join-OpenApiJsonPointer -Pointer $resolved.Pointer -Segment 'headers', $name) if ($null -eq $header -or $header.Node -isnot [System.Collections.IDictionary]) { continue } $headerSchema = $null if ($header.Node.Contains('schema')) { $headerSchema = ConvertTo-OpenApiSchema -Context $Context -Node $header.Node['schema'] -Pointer (Join-OpenApiJsonPointer -Pointer $header.Pointer -Segment 'schema') } elseif ($header.Node['content'] -is [System.Collections.IDictionary]) { $headerContent = ConvertTo-OpenApiMediaTypeList -Context $Context -Content $header.Node['content'] -Pointer (Join-OpenApiJsonPointer -Pointer $header.Pointer -Segment 'content') if ($headerContent.Count -gt 0) { $headerSchema = $headerContent[0].Schema } } $headerDescription = $null if ($null -ne $header.Node['description']) { $headerDescription = [string]$header.Node['description'] } $headers[$name] = [pscustomobject]@{ Description = $headerDescription Required = $header.Node['required'] -eq $true Deprecated = $header.Node['deprecated'] -eq $true Schema = $headerSchema } } } $description = $null if ($null -ne $response['description']) { $description = [string]$response['description'] } $list.Add([pscustomobject]@{ PSTypeName = 'Tcs.OpenApi.Response' StatusCode = $statusCode Description = $description Content = ConvertTo-OpenApiMediaTypeList -Context $Context -Content $response['content'] -Pointer (Join-OpenApiJsonPointer -Pointer $resolved.Pointer -Segment 'content') Headers = $headers }) } return , $list.ToArray() } |