Pax8API/Private/New-Pax8SchemaTemplate.ps1

function New-Pax8SchemaTemplate {
    [CmdletBinding()]
    param (
        [object]$Schema,

        [switch]$IncludeOptional,

        [switch]$IncludeReadOnly,

        [switch]$AsHashtable
    )

    if ($null -eq $Schema) {
        return $null
    }

    $type = [string]$Schema.Type
    $properties = @($Schema.Properties)
    if ($properties.Count -gt 0 -or $type -eq 'object') {
        $template = [ordered]@{}
        foreach ($property in $properties) {
            if ($property.ReadOnly -and -not $IncludeReadOnly) {
                continue
            }

            if (-not $property.Required -and -not $IncludeOptional) {
                continue
            }

            $template[[string]$property.Name] = New-Pax8SchemaTemplate -Schema $property -IncludeOptional:$IncludeOptional -IncludeReadOnly:$IncludeReadOnly -AsHashtable:$AsHashtable
        }

        if ($AsHashtable) {
            return $template
        }

        return [pscustomobject]$template
    }

    if ($type -eq 'array') {
        if ($Schema.Items) {
            $items = @(New-Pax8SchemaTemplate -Schema $Schema.Items -IncludeOptional:$IncludeOptional -IncludeReadOnly:$IncludeReadOnly -AsHashtable:$AsHashtable)
            return ,$items
        }

        return ,@()
    }

    $enum = @($Schema.Enum)
    if ($enum.Count -gt 0) {
        return [string]$enum[0]
    }

    if ($null -ne $Schema.Default) {
        return $Schema.Default
    }

    if ($null -ne $Schema.Example) {
        return $Schema.Example
    }

    switch ([string]$Schema.Format) {
        'uuid' { return [guid]::Empty }
        'date' { return [datetime]'2000-01-01' }
        'date-time' { return [datetime]'2000-01-01T00:00:00Z' }
    }

    switch ($type) {
        'integer' { return 0 }
        'number' { return 0.0 }
        'boolean' { return $false }
        'string' { return '' }
        default { return $null }
    }
}