Private/ParseStructuredResult.ps1

function ParseStructuredResult {
    param(
        [object]$Result, 
        [string[]]$FieldNames = $null,
        [int]$MaximumParseDepth = 6
    )
    $items = ParseInnerStructuredResult -Result $Result -MaximumParseDepth $MaximumParseDepth
        
    if ($items.Count -gt 0) {
        if ($FieldNames) {
            $hash = [System.Collections.Specialized.OrderedDictionary] @{}
            for ($field = 0; $field -lt $items.Count; $field++) {
                $fieldName = "Field$($field + 1)"
                    
                if ($FieldNames.Count -gt $field) {
                    $fieldName = $FieldNames[$field]
                }
                    
                $hash[$fieldName] = $items[$field]                
            }
            
            return [PSCustomObject] $hash
        }

        return $items
    }

    return $null
}

function ParseInnerStructuredResult {
    param(
        [object]$Result,
        [int]$MaximumParseDepth = 6, 
        [int]$Depth = 0,
        [object[]]$Fields = $null
    ) 
     
    if ($null -eq $Fields) {
        $Fields = @()
    } 
        
    $resultFieldCount = $Result.ItemsElementName.Count

    if ($resultFieldCount -eq 0) {
        $Fields += $Result
    } else {
        for ($field = 0; $field -lt $resultFieldCount; $field++) {
            switch ($Result.ItemsElementName[$field].ToString()) {
                'Boolean' {
                    $Fields += [boolean]$Result.Items[$field]
                    break;
                }
                'DateTime' {
                    $Fields += [datetime]$Result.Items[$field]
                    break;
                }
                'FloatingPoint' {
                    $Fields += [double]$Result.Items[$field]
                    break;
                }
                'Integer' {
                    $Fields += [int]$Result.Items[$field]
                    break;
                }
                'Tuple' { 
                    if ($Depth -lt $MaximumParseDepth) {
                        $null = ParseInnerStructuredResult -Result $Result.Items[$field] -MaximumParseDepth $MaximumParseDepth -Depth ($Depth + 1) -Fields $Fields
                    } else {
                        Write-Error -Category LimitsExceeded -Message "Nested tuple expansion exceeded the maximum depth of $($MaximumParseDepth)!"
                    }
                    break
                }
                default { 
                    $Fields += ($Result.Items[$field])
                    break 
                }
            }
        }
    }
                
    if ($Depth -eq 0) {
        return $Fields
    }

    return $null
}