public/formatting/Format-SpectreGrid.ps1

using module "..\..\private\completions\Transformers.psm1"

function Format-SpectreGrid {
    <#
    .SYNOPSIS
    Formats data into a Spectre Console grid.

    .DESCRIPTION
    Formats data into a Spectre Console grid. The grid can be used to display data in a tabular format but it's not as flexible as the Layout widget.
    See https://spectreconsole.net/widgets/grid for more information.

    .EXAMPLE
    # **Example 1**
    # This example demonstrates how to display a grid of rows using the Spectre Console module with a list of lists.
    Format-SpectreGrid -Data @("hello", "I", "am"), @("a", "grid", "of"), @("rows", "using", "spectre")

    .EXAMPLE
    # **Example 2**
    # This example demonstrates how to display a grid of rows using the Spectre Console module with a list of `New-SpectreGridRow` objects.
    # The `New-SpectreGridRow` function is used to create the rows when you want to avoid array collapsing in PowerShell turning your rows into a single array of columns.
    $rows = 4
    $cols = 6
    
    $gridRows = @()
    for ($row = 1; $row -le $rows; $row++) {
        $columns = @()
        for ($col = 1; $col -le $cols; $col++) {
            $columns += "Row $row, Col $col" | Format-SpectrePanel
        }
        $gridRows += New-SpectreGridRow $columns
    }
    
    $gridRows | Format-SpectreGrid
    #>

    [Reflection.AssemblyMetadata("title", "Format-SpectreGrid")]
    param (
        [Parameter(ValueFromPipeline, Mandatory)]
        [GridRowTransformationAttribute()]
        [object]$Data,
        [int] $Width
    )

    begin {
        $grid = [Spectre.Console.Grid]::new()
        $columnsSet = $false
        if ($Width) {
            $grid.Width = $Width
        }
        $grid.Alignment = [Spectre.Console.Justify]::$Justify
        $grid = $grid.AddColumn()
    }

    process {
        if ($Data -is [array]) {
            foreach ($row in $Data) {
                if (!$columnsSet) {
                    0..($row.Count() - 1) | ForEach-Object {
                        $grid = $grid.AddColumn()
                    }
                    $columnsSet = $true
                }
                $grid = $grid.AddRow($row.ToGridRow())
            }
        } else {
            if (!$columnsSet) {
                0..($row.Count() - 1) | ForEach-Object {
                    $grid = $grid.AddColumn()
                }
                $columnsSet = $true
            }
            $grid = $grid.AddRow($Data.ToGridRow())
        }
    }
    
    end {
        return $grid
    }
}