internal/tools/ConvertTo-Hashtable.ps1

function ConvertTo-Hashtable {
    <#
    .SYNOPSIS
        Converts an inputobject into a hashtable.
 
    .DESCRIPTION
        Converts an inputobject into a hashtable.
        Allows remapping keys as needed.
 
    .PARAMETER Include
        Which properties / keys to include.
        Only properties that exist on the input will be included, no matter what.
 
    .PARAMETER Mapping
        A hashtable mapping keys to another name.
        This is used to change the keys on hashtables.
        Specifically, this allows providing PowerShell-compliant parameter names, while passing them to the REST api how the API wants them.
 
    .PARAMETER InputObject
        The object to convert into a hashtable.
 
    .EXAMPLE
        PS C:\> $PSBoundParameters | ConvertTo-Hashtable -Include Name, Description, ID -Mapping @{ ID = 'objectId; Name = 'name' }
 
        Converts the $PSBoundParameters system-variable into a regular hashtable, discarding all entries but Name, Description and ID.
        "Name" will be renamed to be lowercase if specified, "ID" will be renamed to "objectId" if specified.
#>

    [CmdletBinding()]
    param (
        [AllowEmptyCollection()]
        [string[]]
        $Include,

        [Hashtable]
        $Mapping = @{ },

        [Parameter(ValueFromPipeline = $true)]
        $InputObject
    )

    process {
        $result = @{ }
        # Empty includes lead to empty hashtable; Otherwhise it would be the same as $Include='*'
        if ($Include) {
            if ($InputObject -is [System.Collections.IDictionary]) {
                foreach ($pair in $InputObject.GetEnumerator()) {
                    if ($Include -and $pair.Key -notin $Include) { continue }
                    if ($Mapping[$pair.Key]) { $result[$Mapping[$pair.Key]] = $pair.Value }
                    else { $result[$pair.Key] = $pair.Value }
                }
            }
            else {
                foreach ($property in $InputObject.PSObject.Properties) {
                    if ($Include -and $property.Name -notin $Include) { continue }
                    if ($Mapping[$property.Name]) { $result[$Mapping[$property.Name]] = $property.Value }
                    else { $result[$property.Name] = $property.Value }
                }
            }
          }
        $result
    }
}