Private/Invoke-CloudProvider.ps1

function Invoke-CloudProvider {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateSet('Azure', 'AWS', 'GCP')]
        [string]$Provider,

        [Parameter(Mandatory)]
        [hashtable]$CommandMap,

        [hashtable]$ArgumentMap = @{}
    )

    $commandName = $CommandMap[$Provider]

    if (-not $commandName) {
        throw [System.InvalidOperationException]::new(
            "No command mapping exists for provider '$Provider'."
        )
    }

    try {
        $null = Get-Command -Name $commandName -ErrorAction Stop
    } catch {
        $errorRecord = $_
        throw [System.Management.Automation.CommandNotFoundException]::new(
            "Mapped command '$commandName' was not found for provider '$Provider'.",
            $errorRecord.Exception
        )
    }

    & $commandName @ArgumentMap
}