Private/ConvertFrom-CloudPCReportPayload.ps1

function ConvertFrom-CloudPCReportPayload {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [hashtable]$Payload,

        [Parameter(Mandatory)]
        [string]$ReportName,

        [Parameter(Mandatory)]
        [string]$Action,

        [string]$OutputFilePath
    )

    begin { }

    process {
        if (-not $Payload.Schema) {
            throw "Graph report payload for '$ReportName' did not include a Schema array."
        }

        $values = @($Payload.Values)
        $rows = New-Object System.Collections.Generic.List[object]
        if ($values.Count -gt 0 -and $values[0] -is [array]) {
            foreach ($valueRow in $values) {
                $rows.Add($valueRow)
            }
        }
        else {
            $rows.Add($values)
        }

        foreach ($row in $rows) {
            $bag = [ordered]@{
                PSTypeName     = 'WindowsCloudPC.ReportRow'
                ReportName     = $ReportName
                Action         = $Action
                TotalRowCount  = $Payload.TotalRowCount
                OutputFilePath = $OutputFilePath
            }
            $seenColumns = @{}

            for ($i = 0; $i -lt $Payload.Schema.Count; $i++) {
                $column = $Payload.Schema[$i].Column
                if ([string]::IsNullOrWhiteSpace($column)) {
                    $column = "Column$i"
                }

                if ($seenColumns.ContainsKey($column)) {
                    $seenColumns[$column]++
                    $column = "$column$($seenColumns[$column])"
                }
                else {
                    $seenColumns[$column] = 0
                }

                $value = if ($i -lt $row.Count) { $row[$i] } else { $null }
                $bag[$column] = ConvertTo-CloudPCReportValue -Value $value -PropertyType $Payload.Schema[$i].PropertyType -Column $column
            }

            $bag['RawValues'] = $row
            $bag['Raw'] = $Payload
            [pscustomobject]$bag
        }
    }

    end { }
}