private/Assert-ModuleDependency.ps1

function Assert-ModuleDependency {

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateSet('ImportExcel', 'powershell-yaml')]
        [string] $ModuleName
    )

    $ErrorActionPreference = 'Stop'
    [bool] $IsDebug   = $DebugPreference   -ne 'SilentlyContinue'
    [bool] $IsVerbose = $VerbosePreference -ne 'SilentlyContinue'

    [version] $MinimumVersion = switch ($ModuleName) {
        'ImportExcel'       { '7.8.10' }
        'powershell-yaml'   { '0.0.0' }
        default             { '0.0.0' }
    }

    Write-Debug "Asserting $ModuleName with $MinimumVersion"

    # --- Check: Is already loaded?
    $LoadedModule = Get-Module -Name $ModuleName -ErrorAction Ignore
    if ($LoadedModule) {
        if ($LoadedModule.Version -lt $MinimumVersion) {
            throw "The module '$ModuleName' is loaded in version $($LoadedModule.Version), but version $MinimumVersion or higher is required. Update with: Update-Module $ModuleName"
        }
        return
    }

    # --- Check: Installed/available?
    $AvailableModule = Get-Module -Name $ModuleName -ListAvailable -ErrorAction Ignore |
        Sort-Object Version -Descending | Select-Object -First 1

    if (-not $AvailableModule) {
        throw "The required module '$ModuleName' is not installed. Install with: Install-Module $ModuleName"
    }

    if ($AvailableModule.Version -lt $MinimumVersion) {
        throw "The module '$ModuleName' is installed in version $($AvailableModule.Version), but version $MinimumVersion or higher is required. Update with: Update-Module $ModuleName"
    }

    throw "The module '$ModuleName' is installed but not loaded. Import with: Import-Module $ModuleName"
}