Private/Get-ExternalDependenciesParamBasedOnTags.ps1

<#
.SYNOPSIS
    Get module into Version param structure
 
.PARAMETER ModuleName
    Name of the module
 
.PARAMETER Tags
    Array of module tags
#>

function Get-ExternalDependenciesParamBasedOnTags {
    [CmdLetBinding()]
    [OutputType([Hashtable])]
    param (        
        [Parameter(Mandatory = $true, HelpMessage = "Name of the module")]
        [string] $ModuleName,

        [Parameter(Mandatory = $true, HelpMessage = "Array of module tags")]
        [String[]] $Tags
    )
    $ErrorActionPreference = 'Stop'    
    Write-Verbose '-- begin - Get-ExternalDependenciesParamBasedOnTags --'
    Write-Debug "ModuleName: $ModuleName"
    Write-Debug "Tags: $(ConvertTo-Json $Tags)"

    [Hashtable] $NewInstallParam = @{Name = $ModuleName}

    # Get only tags releavant to this module
    $SeachMask = 'ExternalModuleDependencies_{0}_*' -f $ModuleName
    $relevantTags = $Tags |Where-Object {$_ -ilike $SeachMask} | Sort-Object -Unique

    # Get parameters relevant to the Module
    $moduleInstallParam = $relevantTags.Substring(("ExternalModuleDependencies_{0}_" -f $ModuleName).Length)

    # Try to parse each tag to get values for next processing
    foreach ($item in $moduleInstallParam) {
        [string[]] $paramArrray = $item -split '-', 2
        if (![string]::IsNullOrEmpty($paramArrray[0])) {
            switch ($paramArrray[0]) {
                'RequiredVersion' { $NewInstallParam += @{ RequiredVersion = [Version]$paramArrray[1]}; break}
                'MaximumVersion'  { $NewInstallParam += @{ MaximumVersion  = [Version]$paramArrray[1]}; break}
                'RequiredVersion' { $NewInstallParam += @{ RequiredVersion = [Version]$paramArrray[1]}; break}
                'Version'         { $NewInstallParam += @{ Version         = [Version]$paramArrray[1]}; break}
                'AllowPrerelease' { $NewInstallParam += @{ AllowPrerelease = [boolean]::Parse($paramArrray[1])}; break}
                'Guid'            { $NewInstallParam += @{ Guid =            $paramArrray[1]}; break }
                'Prerelease'      { $NewInstallParam += @{ Prerelease =      $paramArrray[1]}; break }
                Default { throw "Unknown tag [$item] relevant to the Module $ModuleName"}
            }
        }
    }

    Write-Debug (ConvertTo-Json -InputObject $NewInstallParam)
    Write-Verbose '-- End of Get-ExternalDependenciesParamBasedOnTags --'
    return $NewInstallParam
}