functions/public/New-GooLogMessage.ps1

function New-GooLogMessage {
    [CmdletBinding(DefaultParameterSetName = 'Separator')]
    [OutputType([string])]
    param (
        [Parameter(Mandatory = $false, ParameterSetName = 'Stage')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Step')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Separator')]
        [char]
        $Character = '-',

        [Parameter(Mandatory = $false, ParameterSetName = 'Stage')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Separator')]
        [int]
        $Length = 72,

        [Parameter(Mandatory = $true, Position = 0, ParameterSetName = 'Step')]
        [string]
        $Value,

        [Parameter(ParameterSetName = 'Stage')]
        [switch]
        $Stage,

        [Parameter(ParameterSetName = 'Step')]
        [switch]
        $Step,

        [Parameter(ParameterSetName = 'Separator')]
        [switch]
        $Separator
    )

    if ($PSCmdlet.ParameterSetName -in @('Stage', 'Step')) {
        $caller = Get-PSCallStack | Select-Object -Skip 1 -First 1
        $functionName = $caller.FunctionName
        $scriptName = try { ($caller.ScriptName | Get-Item).BaseName } catch { 'terminal' }
    }

    switch ($PSCmdlet.ParameterSetName) {
        'Stage' {
            $Value = "[ ${functionName}:${scriptName} ]"
            $fullPadLength = $Length - $Value.Length
            $leftPadLength = [int]($fullPadLength / 2) + $Value.Length
            $Value = $Value.PadLeft($leftPadLength, $Character)
            $Value = $Value.PadRight($Length, $Character)
            return $Value
        }

        'Step' {
            return "$($Character.ToString() * 3) $Value ($functionName) @ $scriptName $($Character.ToString() * 3)"
        }

        'Separator' {
            return ''.PadLeft($Length, $Character)
        }
    }
}