demo/core/setup/validate.ps1

function Test-SetupParams([ref] $messages, 
    [string[]] $stringParameterNames,
    [string[]] $positiveIntParameterNames,
    [string]   $rootPwd,
    [string]   $replicatorPwd,
    [int]      $replicaCount,
    [int]      $lowerCaseTableNames,
    [string]   $workDirectory,
    [string[]] $extraValuesFiles) {

    $messages.Value = @()

    $useReplication = $replicaCount -gt 0

    ### Validate string parameters
    $emptyStringExceptionList = @()
    if (-not $useReplication) {
        $emptyStringExceptionList += ('replicatorPwd','replicaName')
    }
    $stringParameterNames | ForEach-Object {
        $var = Get-Variable -Name $_
        $onExceptionList = $emptyStringExceptionList -contains $_
        if (-not $onExceptionList -and [string]::IsNullOrWhiteSpace($var.Value)) {
            $messages.Value += "Invalid string value for parameter; please specify a value for -$($var.Name)."
        }
    }

    ### Validate positive int parameters
    $positiveIntParameterNames | ForEach-Object {
        $var = (Get-Variable -Name $_)
        if ($var.Value -lt 0) {
            $messages.Value += "Invalid int value for parameter; please specify a number greater than 0 for -$($var.Name)."
        }
    }

    ### Validate choice parameters
    $validLowerCaseTableNames = 0,1,2
    if ($validLowerCaseTableNames -notcontains $lowerCaseTableNames) {
        $messages.Value += "Invalid choice for parameter; please specify a valid value ($validLowerCaseTableNames) for -lowerCaseTableNames."
    }

    ### Validate work directory
    if (-not (Test-Path $workDirectory -PathType Container)) {
        $messages.Value += "Invalid directory ($workDir) for parameter -workDir; please specify an existing directory."
    }

    ### Validate extra values files
    $extraValuesFiles | ForEach-Object {
        if (-not (Test-Path $_ -PathType Any)) {
            $messages.Value += "Invalid values file ($_); please specify existing values files."
        }
    }

    $passwordsToCheck = @([tuple]::create('rootPwd', $rootPwd))
    if ($useReplication) {
        $passwordsToCheck += [tuple]::create('replicatorPwd', $replicatorPwd)
    }

    $passwordsToCheck | ForEach-Object {
        $passwordMessages = @()
        if (-not (Test-MariaDBPassword ([ref]$passwordMessages) $_.item1 $_.item2 )) {
            $passwordMessages | ForEach-Object {
                $messages.Value += $_
            }
        }
    }

    $messages.Value.count -eq 0
}

function Test-MariaDBPassword([ref] $messages, [string] $paramName, [string] $paramValue) {

    $messages.Value = @()

    $paramValueLength = $paramValue.Length
    if ($paramValueLength -lt 8 -or $paramValueLength -gt 32) {
        $messages.Value += "Value for parameter -$paramName must be between 8 and 32 characters"
    }
    if ($paramValue.Contains("-")) {
        $messages.Value += "Value for parameter -$paramName must not contain a single quote character"
    }

    $messages.Value.count -eq 0
}