functions/public/Write-GooLog.ps1

class GooLogValidLevels : System.Management.Automation.IValidateSetValuesGenerator {
    [string[]] GetValidValues() {
        return [string[]] $Script:GooLog.Levels
    }
}

function Write-GooLog {
    [CmdletBinding(DefaultParameterSetName = 'Default')]
    [OutputType([string])]
    [OutputType($null)]
    param (
        [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true, ParameterSetName = 'Default')]
        [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true, ParameterSetName = 'Color')]
        [AllowNull()]
        [AllowEmptyString()]
        [string]
        $Message,

        [Parameter(Mandatory = $false, ParameterSetName = 'Default')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Color')]
        [ValidateSet([GooLogValidLevels])]
        [string]
        $Level = 'INFO',

        [Parameter(ParameterSetName = 'Default')]
        [Parameter(ParameterSetName = 'Color')]
        [switch]
        $NoNewline,

        [Parameter(ParameterSetName = 'Default')]
        [Parameter(ParameterSetName = 'Color')]
        [switch]
        $NoDate,

        [Parameter(ParameterSetName = 'Default')]
        [Parameter(ParameterSetName = 'Color')]
        [switch]
        $NoLevel,

        [Parameter(ParameterSetName = 'Default')]
        [Parameter(ParameterSetName = 'Color')]
        [switch]
        $PassThru,

        [Parameter(Mandatory = $false, ParameterSetName = 'Color')]
        [System.ConsoleColor]
        $BackgroundColor,

        [Parameter(Mandatory = $false, ParameterSetName = 'Color')]
        [System.ConsoleColor]
        $ForegroundColor,

        [Parameter(ParameterSetName = 'Color')]
        [switch]
        $Ansi
    )

    process {
        $__date = if (-not $NoDate) {
            $dateParams = $Script:GooLog.Date
            "[$(Get-Date @dateParams)]"
        }

        $__level = if (-not $NoLevel) {
            "[$Level]"
        }

        $__message = (@($__date, $__level, $Message) | Where-Object { $null -ne $_ }) -join ' '
        if ($Script:GooLog.Path) {
            $__message | Add-Content -Path $Script:GooLog.Path -NoNewline:$NoNewline
        }

        $writeHostParams = @{
            NoNewLine = $NoNewline;
        }

        if ('Color' -eq $PSCmdlet.ParameterSetName) {
            if (Test-GooLogAnsi $Ansi) {
                if ($BackgroundColor) {
                    $__message = $Script:GooLog.Ansi.Template -f ($Script:GooLog.Ansi.Colors[$BackgroundColor.value__] + 10), $__message, 49
                }

                if ($ForegroundColor) {
                    $__message = $Script:GooLog.Ansi.Template -f $Script:GooLog.Ansi.Colors[$ForegroundColor.value__], $__message, 39
                }
            }
            else {
                if ($BackgroundColor) {
                    $writeHostParams['BackgroundColor'] = $BackgroundColor
                }

                if ($ForegroundColor) {
                    $writeHostParams['ForegroundColor'] = $ForegroundColor
                }
            }
        }

        $__message | Write-Host @writeHostParams
        if ($PassThru) {
            return $__message
        }
    }
}