Private/Get-HDTConsoleJsonProperty.ps1
|
function Get-HDTConsoleJsonProperty { <# .SYNOPSIS Reads one property out of a parsed JSON object, answering a default when it is absent. .DESCRIPTION THE BOOT IMAGE MANIFEST IS NOT A SCHEMA-VALIDATED DOCUMENT the way the workspace YAML is: it is written by Update-HDTBootImage, it has grown keys between phases (artifacts.isoBootWimSha256 arrived in 05-04), and the console has to read manifests written by older builds without falling over. Under Set-StrictMode -Version Latest, reading a property that ConvertFrom-Json did not create throws PropertyNotFoundException - so a console that reads the manifest field by field would refuse to open a share whose image was built one phase ago. This is the reader that turns "the key is not there" into a default instead, and it is the only place that decision is made. The lookup goes through PSObject.Properties rather than a dotted access, because that is the form that does not throw. .PARAMETER InputObject The parsed JSON object, or $null. .PARAMETER Name The property to read. .PARAMETER Default What to answer when the property is absent, is $null, or the object itself is $null. Defaults to an empty string. .INPUTS None. This command does not accept pipeline input. .OUTPUTS System.Object .EXAMPLE Get-HDTConsoleJsonProperty -InputObject $manifest -Name 'builtOn' .EXAMPLE $artifact = Get-HDTConsoleJsonProperty -InputObject $manifest -Name 'artifacts' -Default $null The nested case: absent, and the caller gets $null rather than an exception three frames down. #> [CmdletBinding()] [OutputType([object])] param( [Parameter(Mandatory = $true, Position = 0)] [AllowNull()] [object] $InputObject, [Parameter(Mandatory = $true, Position = 1)] [ValidateNotNullOrEmpty()] [string] $Name, [Parameter()] [AllowNull()] [object] $Default = '' ) Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' if ($null -eq $InputObject) { return $Default } $property = $InputObject.PSObject.Properties[$Name] if ($null -eq $property) { return $Default } if ($null -eq $property.Value) { return $Default } return $property.Value } |