Private/Test-ColorScriptNameValue.ps1

function Test-ColorScriptNameValue {
    param(
        [Parameter(Mandatory, Position = 0)]
        [object]$Value,
        [switch]$AllowWildcard,
        [switch]$AllowEmpty
    )

    $stringValue = [string]$Value

    if ([string]::IsNullOrWhiteSpace($stringValue)) {
        if ($AllowEmpty) {
            return $true
        }

        $message = if ($script:Messages -and $script:Messages.ContainsKey('InvalidScriptNameEmpty')) {
            $script:Messages.InvalidScriptNameEmpty
        }
        else {
            'Color script name cannot be empty or whitespace.'
        }

        throw [System.Management.Automation.ValidationMetadataException]::new($message)
    }

    $wildcardCharacters = @([char]'*', [char]'?')
    $invalidCharacterList = New-Object 'System.Collections.Generic.List[char]'
    foreach ($character in [System.IO.Path]::GetInvalidFileNameChars()) {
        $null = $invalidCharacterList.Add($character)
    }

    $throwInvalidCharacter = {
        param([string]$Name)

        $characterMessage = if ($script:Messages -and $script:Messages.ContainsKey('InvalidScriptNameCharacters')) {
            $script:Messages.InvalidScriptNameCharacters -f $Name
        }
        else {
            "Color script name '$Name' contains invalid characters."
        }

        throw [System.Management.Automation.ValidationMetadataException]::new($characterMessage)
    }

    if ($AllowWildcard) {
        foreach ($wc in $wildcardCharacters) {
            $null = $invalidCharacterList.Remove($wc)
        }
    }
    elseif ($stringValue.IndexOfAny([char[]]$wildcardCharacters) -ge 0) {
        & $throwInvalidCharacter $stringValue
    }

    $invalidCharacters = $invalidCharacterList.ToArray()

    if ($invalidCharacters -and $stringValue.IndexOfAny($invalidCharacters) -ge 0) {
        & $throwInvalidCharacter $stringValue
    }

    return $true
}