Write.Extensions.psm1

#Requires -Version 5.0;
function Get-HR { 
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory)]
        [String] $pattern
    )   
    [String] $hr = "";
    while ($hr.Length -lt ($Host.UI.RawUI.WindowSize.Width - 7)) {
        $hr += $pattern;
    }
    return $hr;
}
function Write-HR { 
    [CmdletBinding()]
    Param
    (
        [String] $pattern = "-"
    ) 
    Write-White "$(Get-Hr $pattern)";
}
function Get-ErrorAsString {
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory)]
        [String] $id
    )
    [String] $message = "{ $id }`n";
    $message += $(Get-HR "-");
    $message += "`n";

    if ($null -eq $Error) {
        $message += "`$Error -eq `$null";
    } elseif (0 -eq $Error.Count) {
        $message += "`$Error.Count -eq 0";
    } elseif ($null -eq $Error[0]) {
        $message += "`$Error[0] -eq `$null";
    } else {
        [System.Management.Automation.ErrorRecord] $err = $Error[0];
        $message += $err.Exception.GetType();
        $message += "`n";
        $message += $err.Exception.Message.Trim();
        $message += "`n`n";
        $message += $err.ScriptStackTrace;
        $message += "`n";
    }

    $message += $(Get-Hr "-");
    $message += "`n`n";
    return $message;
}
function Write-Exception {
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory)]
        [String] $id
    )
    Write-Host $(Get-ErrorAsString $id) -ForegroundColor ([System.ConsoleColor]::Red);
}
function Write-ErrorAsVerbose {
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory)]
        [String] $id
    )
    Write-Verbose $(Get-ErrorAsString $id);
}
function Write-ErrorAsWarning {
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory)]
        [String] $id
    )
    Write-Warning $(Get-ErrorAsString $id);
}
function Write-Color {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine,

        [Parameter()]
        [System.ConsoleColor] $ForegroundColor,

        [Parameter()]
        [System.ConsoleColor] $BackgroundColor

    )
    Write-Host -Object $Object -Separator $Separator -NoNewLine:$NoNewLine -ForegroundColor $ForegroundColor -BackgroundColor $BackgroundColor;
}
function Write-White {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::White)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-Gray {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::Gray)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-DarkGray {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::DarkGray)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-Black {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::Black)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-Yellow {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::Yellow)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-DarkYellow {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::DarkYellow)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-Green {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::Green)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-DarkGreen {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::DarkGreen)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-Red {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::Red)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-DarkRed {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::DarkRed)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-Blue {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::Blue)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-DarkBlue {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::DarkBlue)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-Magenta {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::Magenta)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-DarkMagenta {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::DarkMagenta)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-Cyan {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::Cyan)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-DarkCyan {
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [Object] $Object,

        [Parameter()]
        [Object] $Separator,

        [Parameter()]
        [Switch] $NoNewLine
    )
    Write-Color -ForegroundColor "$([System.ConsoleColor]::DarkCyan)" -BackgroundColor "$([System.Console]::BackgroundColor)" -Object $Object -Separator $Separator -NoNewLine:$NoNewLine;
}
function Write-KeyValue {
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory)]
        [String] $key,

        [Parameter(Mandatory)]
        [String] $value,

        [Parameter()]
        [String] $style = "style-01"
    )
    switch ($style) {
        "style-01" {
            Write-DarkCyan "> " -NoNewLine;
            Write-Cyan $key;
            Write-DarkYellow " > " -NoNewLine;
            Write-Yellow $value;
            break;
        }
        default {             
            throw "Unknown style";
        }
    }
}