public/formatting/Format-SpectreJson.ps1
using module "..\..\private\completions\Completers.psm1" function Format-SpectreJson { <# .SYNOPSIS Formats an array of objects into a Spectre Console Json. Thanks to [trackd](https://github.com/trackd) for adding this. ![Spectre json example](/json.png) .DESCRIPTION This function takes an array of objects and converts them into Json using the Spectre Console Json Library. .PARAMETER Data The array of objects to be formatted into Json. .PARAMETER NoBorder If specified, the Json will not be surrounded by a border. .PARAMETER Border The border style of the Json. Default is "Rounded". .PARAMETER Color The color of the Json border. Default is the accent color of the script. .PARAMETER Title The title of the Json. .PARAMETER Width The width of the Json panel. .PARAMETER Height The height of the Json panel. .EXAMPLE # This example formats an array of objects into a table with a double border and the accent color of the script. $data = @( [pscustomobject]@{ Name = "John" Age = 25 City = "New York" IsEmployed = $true Salary = 10 Hobbies = @("Reading", "Swimming") Address = @{ Street = "123 Main St" ZipCode = $null } }, [pscustomobject]@{ Name = "Jane" Age = 30 City = "Los Angeles" IsEmployed = $false Salary = $null Hobbies = @("Painting", "Hiking") Address = @{ Street = "456 Elm St" ZipCode = "90001" } } ) Format-SpectreJson -Data $data -Title "Employee Data" -Border "Rounded" -Color "Green" #> [Reflection.AssemblyMetadata("title", "Format-SpectreJson")] [Alias('fsj')] param ( [Parameter(ValueFromPipeline, Mandatory)] [object] $Data, [int] $Depth, [string] $Title, [switch] $NoBorder, [ValidateSet([SpectreConsoleBoxBorder], ErrorMessage = "Value '{0}' is invalid. Try one of: {1}")] [string] $Border = "Rounded", [ValidateSpectreColor()] [ArgumentCompletionsSpectreColors()] [string] $Color = $script:AccentColor.ToMarkup(), [ValidateScript({ $_ -gt 0 -and $_ -le (Get-HostWidth) }, ErrorMessage = "Value '{0}' is invalid. Cannot be negative or exceed console width.")] [int] $Width, [ValidateScript({ $_ -gt 0 -and $_ -le (Get-HostHeight) }, ErrorMessage = "Value '{0}' is invalid. Cannot be negative or exceed console height.")] [int] $Height, [switch] $Expand ) begin { $collector = [System.Collections.Generic.List[psobject]]::new() $splat = @{ WarningAction = "Ignore" } if ($Depth) { $splat.Depth = $Depth } } process { $collector.add($data) } end { $json = [Spectre.Console.Json.JsonText]::new(($collector | ConvertTo-Json @splat)) $json.BracesStyle = [Spectre.Console.Style]::new([Spectre.Console.Color]::Red) $json.BracketsStyle = [Spectre.Console.Style]::new([Spectre.Console.Color]::Green) $json.ColonStyle = [Spectre.Console.Style]::new([Spectre.Console.Color]::Blue) $json.CommaStyle = [Spectre.Console.Style]::new([Spectre.Console.Color]::CadetBlue) $json.StringStyle = [Spectre.Console.Style]::new([Spectre.Console.Color]::Yellow) $json.NumberStyle = [Spectre.Console.Style]::new([Spectre.Console.Color]::Cyan2) $json.BooleanStyle = [Spectre.Console.Style]::new([Spectre.Console.Color]::Teal) $json.NullStyle = [Spectre.Console.Style]::new([Spectre.Console.Color]::Plum1) if($NoBorder) { Write-AnsiConsole $json return } $panel = [Spectre.Console.Panel]::new($json) $panel.Border = [Spectre.Console.BoxBorder]::$Border $panel.BorderStyle = [Spectre.Console.Style]::new(($Color | Convert-ToSpectreColor)) if ($Title) { $panel.Header = [Spectre.Console.PanelHeader]::new($Title) } if ($width) { $panel.Width = $Width } if ($height) { $panel.Height = $Height } if($Expand) { $panel.Expand = $Expand } Write-AnsiConsole $panel } } |