Private/ConvertTo-SFSortValue.ps1

function ConvertTo-SFSortValue {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        $Value,

        [Parameter(Mandatory)]
        [ValidateSet('String', 'Integer', 'Decimal', 'DateTime', 'Boolean')]
        [string]$Type,

        [Parameter(Mandatory)]
        [string]$Field
    )

    if ($null -eq $Value -or ($Value -is [string] -and [string]::IsNullOrWhiteSpace($Value))) {
        throw "LatestByGroup sort field '$Field' has no value."
    }

    switch ($Type) {
        'String' {
            if ($Value -is [System.Collections.IEnumerable] -and $Value -isnot [string]) {
                throw "LatestByGroup sort field '$Field' must contain a scalar value."
            }
            return [string]$Value
        }
        'Integer' {
            $parsed = 0L
            if (-not [long]::TryParse([string]$Value, [Globalization.NumberStyles]::Integer, [Globalization.CultureInfo]::InvariantCulture, [ref]$parsed)) {
                throw "LatestByGroup sort field '$Field' value '$Value' is not a valid integer."
            }
            return $parsed
        }
        'Decimal' {
            $parsed = [decimal]::Zero
            if (-not [decimal]::TryParse([string]$Value, [Globalization.NumberStyles]::Number, [Globalization.CultureInfo]::InvariantCulture, [ref]$parsed)) {
                throw "LatestByGroup sort field '$Field' value '$Value' is not a valid decimal."
            }
            return $parsed
        }
        'DateTime' {
            return ConvertTo-SFDateTimeOffset -Value $Value
        }
        'Boolean' {
            $parsed = $false
            if (-not [bool]::TryParse([string]$Value, [ref]$parsed)) {
                throw "LatestByGroup sort field '$Field' value '$Value' is not a valid boolean."
            }
            return $parsed
        }
    }
}