private/configurations/validation/validation.ps1

Register-DbatoolsConfigValidation -Name "bool" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSObject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }
    try {
        if ($Value.GetType().FullName -ne "System.Boolean") {
            $Result.Message = "Not a boolean: $Value"
            $Result.Success = $False
            return $Result
        }
    } catch {
        $Result.Message = "Not a boolean: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $Value

    return $Result
}
Register-DbatoolsConfigValidation -Name "consolecolor" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSObject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try { [System.ConsoleColor]$color = $Value }
    catch {
        $Result.Message = "Not a console color: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $color

    return $Result
}
Register-DbatoolsConfigValidation -Name "datetime" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSObject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try { [DateTime]$DateTime = $Value }
    catch {
        $Result.Message = "Not a DateTime: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $DateTime

    return $Result
}
Register-DbatoolsConfigValidation -Name "double" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSOBject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try { [double]$number = $Value }
    catch {
        $Result.Message = "Not a double: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $number

    return $Result
}
Register-DbatoolsConfigValidation -Name "integer" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSOBject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try { [int]$number = $Value }
    catch {
        $Result.Message = "Not an integer: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $number

    return $Result
}
Register-DbatoolsConfigValidation -Name "integer0to9" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSOBject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try { [int]$number = $Value }
    catch {
        $Result.Message = "Not an integer: $Value"
        $Result.Success = $False
        return $Result
    }

    if (($number -lt 0) -or ($number -gt 9)) {
        $Result.Message = "Out of range. Specify a number ranging from 0 to 9"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $Number

    return $Result
}
Register-DbatoolsConfigValidation -Name "integerpositive" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSOBject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try { [int]$number = $Value }
    catch {
        $Result.Message = "Not an integer: $Value"
        $Result.Success = $False
        return $Result
    }

    if ($number -lt 0) {
        $Result.Message = "Negative value: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $number

    return $Result
}
Register-DbatoolsConfigValidation -Name "long" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSOBject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try { [long]$number = $Value }
    catch {
        $Result.Message = "Not a long: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $number

    return $Result
}
Register-DbatoolsConfigValidation -Name "securestring" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSObject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }
    try {
        if ($Value.GetType().FullName -ne "System.Security.SecureString") {
            $Result.Message = "Not a securestring: $Value"
            $Result.Success = $False
            return $Result
        }
    } catch {
        $Result.Message = "Not a securestring: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $Value

    return $Result
}
Register-DbatoolsConfigValidation -Name "sizestyle" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSObject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try { [Dataplat.Dbatools.Utility.SizeStyle]$style = $Value }
    catch {
        $Result.Message = "Not a size style: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $style

    return $Result
}
Register-DbatoolsConfigValidation -Name "string" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSObject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try {
        # Seriously, this should work for almost anybody and anything
        [string]$data = $Value
    } catch {
        $Result.Message = "Not a string: $Value"
        $Result.Success = $False
        return $Result
    }

    if ([string]::IsNullOrEmpty($data)) {
        $Result.Message = "Is an empty string: $Value"
        $Result.Success = $False
        return $Result
    }

    if ($data -eq $Value.GetType().FullName) {
        $Result.Message = "Is an object with no proper string representation: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $data

    return $Result
}
Register-DbatoolsConfigValidation -Name "timespan" -ScriptBlock {
    param (
        $Value
    )

    $Result = New-Object PSObject -Property @{
        Success = $True
        Value   = $null
        Message = ""
    }

    try { [timespan]$timespan = $Value }
    catch {
        $Result.Message = "Not a Timespan: $Value"
        $Result.Success = $False
        return $Result
    }

    $Result.Value = $timespan

    return $Result
}