Private/Import-PlumberDependency.ps1

function Import-PlumberDependency {
    <#
        .SYNOPSIS
        Imports or installs PowerShell module dependencies.
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [object[]]
        $Dependency,

        [switch]
        $InstallMissing
    )

    foreach ($item in $Dependency) {
        $name = $item.ModuleName
        $version = $item.ModuleVersion

        if (-not $name -or -not $version) {
            throw 'Plumber dependency entries must include ModuleName and ModuleVersion.'
        }

        $loadedModule = Get-Module -Name $name |
            Where-Object { $_.Version -ge [version]$version } |
                Select-Object -First 1
        if ($loadedModule) {
            continue
        }

        try {
            Import-Module -Name $name -MinimumVersion $version -ErrorAction Stop
            continue
        }
        catch {
            $importError = $PSItem
        }

        if (-not $InstallMissing) {
            throw (
                "Could not load $name v$version. " +
                "Install with 'Install-Module $name -RequiredVersion $version -Scope CurrentUser -Force'. " +
                "To allow Plumber to install missing dependencies during import, use " +
                "'Import-Module Plumber -ArgumentList @{ InstallMissingDependencies = `$true }'. " +
                "Error: $importError"
            )
        }

        $installModule = Get-Command Install-Module -ErrorAction SilentlyContinue
        if (-not $installModule) {
            throw (
                "Could not load $name v$version and Install-Module is not available. " +
                "Install the dependency manually. Error: $importError"
            )
        }

        try {
            Install-PlumberModuleDependency -Name $name -RequiredVersion $version
            Import-Module -Name $name -MinimumVersion $version -ErrorAction Stop
        }
        catch {
            throw (
                "Could not install or load $name v$version. " +
                "Install with 'Install-Module $name -RequiredVersion $version -Scope CurrentUser -Force'. " +
                "Error: $PSItem"
            )
        }
    }
}