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 = @{ }
        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
    }
}