Private/ConvertTo-SortedPermission.ps1

function ConvertTo-SortedPermission {
    <#
    .SYNOPSIS
    Correctly sorts PAS Safe Permissions

    .DESCRIPTION
    Safe permissions should be sent to the API in a specific order.
    When given a hashtable of parameters as input, safe permission key
    value pairs are returned in the correct order and format for
    inclusion in request body.

    .PARAMETER Parameters
    The input parameters to filter for safe permissons

    .PARAMETER Gen1
    Format permission object for Gen1 Add Safe Member

    .PARAMETER Gen2
    Format permission object for Gen2 Add Safe Member

    .EXAMPLE
    $PSBoundParameters | ConvertTo-SortedPermission -Gen1

    Returns key value pairs for $PSBoundParameters which relate to Gen1 safe permissions

    .EXAMPLE
    $PSBoundParameters | ConvertTo-SortedPermission -Gen2

    Returns hashtable for $PSBoundParameters which formatted for Gen2 safe permissions

    #>

    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'Permissions', Justification = 'False Positive')]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'Gen1', Justification = 'False Positive')]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'Gen2', Justification = 'False Positive')]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'ConnectOnly', Justification = 'False Positive')]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'ReadOnly', Justification = 'False Positive')]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'Approver', Justification = 'False Positive')]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'AccountsManager', Justification = 'False Positive')]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'Full', Justification = 'False Positive')]
    [CmdletBinding()]
    param (
        [parameter(
            Mandatory = $false,
            ValueFromPipeline = $true
        )]
        [hashtable]$Parameters,

        [parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ParameterSetName = 'Gen1'
        )]
        [switch]$Gen1,

        [parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ParameterSetName = 'Gen2'
        )]
        [switch]$Gen2,

        [parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ParameterSetName = 'ConnectOnly'
        )]
        [switch]$ConnectOnly,

        [parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ParameterSetName = 'ReadOnly'
        )]
        [switch]$ReadOnly,

        [parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ParameterSetName = 'Approver'
        )]
        [switch]$Approver,

        [parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ParameterSetName = 'AccountsManager'
        )]
        [switch]$AccountsManager,

        [parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ParameterSetName = 'Full'
        )]
        [switch]$Full
    )

    begin {

        switch ($PSCmdlet.ParameterSetName) {

            'Gen1' {
                $OrderedPermissions = [ordered]@{
                    UseAccounts                            = $false
                    RetrieveAccounts                       = $false
                    ListAccounts                           = $false
                    AddAccounts                            = $false
                    UpdateAccountContent                   = $false
                    UpdateAccountProperties                = $false
                    InitiateCPMAccountManagementOperations = $false
                    SpecifyNextAccountContent              = $false
                    RenameAccounts                         = $false
                    DeleteAccounts                         = $false
                    UnlockAccounts                         = $false
                    ManageSafe                             = $false
                    ManageSafeMembers                      = $false
                    BackupSafe                             = $false
                    ViewAuditLog                           = $false
                    ViewSafeMembers                        = $false
                    RequestsAuthorizationLevel             = 0
                    AccessWithoutConfirmation              = $false
                    CreateFolders                          = $false
                    DeleteFolders                          = $false
                    MoveAccountsAndFolders                 = $false
                }
                break
            }

            'Gen2' {
                $OrderedPermissions = [ordered]@{
                    useAccounts                            = $false
                    retrieveAccounts                       = $false
                    listAccounts                           = $false
                    addAccounts                            = $false
                    updateAccountContent                   = $false
                    updateAccountProperties                = $false
                    initiateCPMAccountManagementOperations = $false
                    specifyNextAccountContent              = $false
                    renameAccounts                         = $false
                    deleteAccounts                         = $false
                    unlockAccounts                         = $false
                    manageSafe                             = $false
                    manageSafeMembers                      = $false
                    backupSafe                             = $false
                    viewAuditLog                           = $false
                    viewSafeMembers                        = $false
                    accessWithoutConfirmation              = $false
                    createFolders                          = $false
                    deleteFolders                          = $false
                    moveAccountsAndFolders                 = $false
                    requestsAuthorizationLevel1            = $false
                    requestsAuthorizationLevel2            = $false
                }
                break
            }

            'ConnectOnly' {
                $OrderedPermissions = [ordered]@{
                    useAccounts                            = $true
                    retrieveAccounts                       = $false
                    listAccounts                           = $true
                    addAccounts                            = $false
                    updateAccountContent                   = $false
                    updateAccountProperties                = $false
                    initiateCPMAccountManagementOperations = $false
                    specifyNextAccountContent              = $false
                    renameAccounts                         = $false
                    deleteAccounts                         = $false
                    unlockAccounts                         = $false
                    manageSafe                             = $false
                    manageSafeMembers                      = $false
                    backupSafe                             = $false
                    viewAuditLog                           = $false
                    viewSafeMembers                        = $false
                    accessWithoutConfirmation              = $false
                    createFolders                          = $false
                    deleteFolders                          = $false
                    moveAccountsAndFolders                 = $false
                    requestsAuthorizationLevel1            = $false
                    requestsAuthorizationLevel2            = $false
                }
                break
            }

            'ReadOnly' {
                $OrderedPermissions = [ordered]@{
                    useAccounts                            = $true
                    retrieveAccounts                       = $true
                    listAccounts                           = $true
                    addAccounts                            = $false
                    updateAccountContent                   = $false
                    updateAccountProperties                = $false
                    initiateCPMAccountManagementOperations = $false
                    specifyNextAccountContent              = $false
                    renameAccounts                         = $false
                    deleteAccounts                         = $false
                    unlockAccounts                         = $false
                    manageSafe                             = $false
                    manageSafeMembers                      = $false
                    backupSafe                             = $false
                    viewAuditLog                           = $false
                    viewSafeMembers                        = $false
                    accessWithoutConfirmation              = $false
                    createFolders                          = $false
                    deleteFolders                          = $false
                    moveAccountsAndFolders                 = $false
                    requestsAuthorizationLevel1            = $false
                    requestsAuthorizationLevel2            = $false
                }
                break
            }
            'Approver' {
                $OrderedPermissions = [ordered]@{
                    useAccounts                            = $false
                    retrieveAccounts                       = $false
                    listAccounts                           = $true
                    addAccounts                            = $false
                    updateAccountContent                   = $false
                    updateAccountProperties                = $false
                    initiateCPMAccountManagementOperations = $false
                    specifyNextAccountContent              = $false
                    renameAccounts                         = $false
                    deleteAccounts                         = $false
                    unlockAccounts                         = $false
                    manageSafe                             = $false
                    manageSafeMembers                      = $true
                    backupSafe                             = $false
                    viewAuditLog                           = $false
                    viewSafeMembers                        = $true
                    accessWithoutConfirmation              = $false
                    createFolders                          = $false
                    deleteFolders                          = $false
                    moveAccountsAndFolders                 = $false
                    requestsAuthorizationLevel1            = $true
                    requestsAuthorizationLevel2            = $false
                }
                break
            }

            'AccountsManager' {
                $OrderedPermissions = [ordered]@{
                    useAccounts                            = $true
                    retrieveAccounts                       = $true
                    listAccounts                           = $true
                    addAccounts                            = $true
                    updateAccountContent                   = $true
                    updateAccountProperties                = $true
                    initiateCPMAccountManagementOperations = $true
                    specifyNextAccountContent              = $true
                    renameAccounts                         = $true
                    deleteAccounts                         = $true
                    unlockAccounts                         = $true
                    manageSafe                             = $false
                    manageSafeMembers                      = $true
                    backupSafe                             = $false
                    viewAuditLog                           = $true
                    viewSafeMembers                        = $true
                    accessWithoutConfirmation              = $true
                    createFolders                          = $false
                    deleteFolders                          = $false
                    moveAccountsAndFolders                 = $false
                    requestsAuthorizationLevel1            = $false
                    requestsAuthorizationLevel2            = $false
                }
                break
            }

            'Full' {
                $OrderedPermissions = [ordered]@{
                    useAccounts                            = $true
                    retrieveAccounts                       = $true
                    listAccounts                           = $true
                    addAccounts                            = $true
                    updateAccountContent                   = $true
                    updateAccountProperties                = $true
                    initiateCPMAccountManagementOperations = $true
                    specifyNextAccountContent              = $true
                    renameAccounts                         = $true
                    deleteAccounts                         = $true
                    unlockAccounts                         = $true
                    manageSafe                             = $true
                    manageSafeMembers                      = $true
                    backupSafe                             = $true
                    viewAuditLog                           = $true
                    viewSafeMembers                        = $true
                    accessWithoutConfirmation              = $true
                    createFolders                          = $true
                    deleteFolders                          = $true
                    moveAccountsAndFolders                 = $true
                    requestsAuthorizationLevel1            = $true
                    requestsAuthorizationLevel2            = $false
                }
                break
            }
        }
    }

    process {

        if ($PSCmdlet.ParameterSetName -in 'ConnectOnly', 'ReadOnly', 'Approver', 'AccountsManager', 'Full') {

            $Permissions = $OrderedPermissions
            return $Permissions

        }

        #Input parameters have been provided

        if ($null -ne $Parameters.Keys) {

            #For each Ordered Safe Member Permission
            $OrderedPermissions.keys | ForEach-Object {

                $Permissions = [ordered]@{ }

            } {

                #Parameter match
                if ($Parameters.ContainsKey($PSItem)) {

                    #Add to hash table in key/value pair
                    $Permissions.Add($PSItem, $Parameters[$PSItem])

                }

            } {

                if (($Permissions.Keys).count -gt 0) {

                    switch ($PSCmdlet.ParameterSetName) {

                        'Gen1' {

                            #return permissions, in order
                            $Permissions.getenumerator() | ForEach-Object { $PSItem }

                            break

                        }

                        'Gen2' {

                            #return permissions, in order
                            $Permissions

                            break

                        }

                    }

                }

            }

        }

    }

    end {

    }

}