62 lines
1.9 KiB
PowerShell
62 lines
1.9 KiB
PowerShell
function Get-ConfigurationDataPathValue {
|
|
[CmdletBinding()]
|
|
Param(
|
|
[Parameter(Mandatory=$true)]
|
|
[AllowNull()]
|
|
$Value,
|
|
|
|
[Parameter(Mandatory=$true)]
|
|
[string]
|
|
$Path
|
|
)
|
|
|
|
if([string]::IsNullOrWhiteSpace($Path)){
|
|
throw "Configuration data reference path must not be empty."
|
|
}
|
|
|
|
$Current = $Value
|
|
$Segments = @($Path -split '\.')
|
|
|
|
foreach($Segment in $Segments){
|
|
if([string]::IsNullOrWhiteSpace($Segment)){
|
|
throw "Configuration data reference path [$Path] contains an empty segment."
|
|
}
|
|
|
|
if($null -eq $Current){
|
|
throw "Configuration data reference path [$Path] was not found. Segment [$Segment] resolved from a null value."
|
|
}
|
|
|
|
if($Current -is [System.Collections.IDictionary]){
|
|
if(-not $Current.Contains($Segment)){
|
|
throw "Configuration data reference path [$Path] was not found. Segment [$Segment] is missing."
|
|
}
|
|
|
|
$Current = $Current[$Segment]
|
|
continue
|
|
}
|
|
|
|
if($Current -is [System.Array] -and $Current -isnot [string]){
|
|
$Index = 0
|
|
if(-not [int]::TryParse($Segment, [ref]$Index)){
|
|
throw "Configuration data reference path [$Path] expected a numeric array index at segment [$Segment]."
|
|
}
|
|
|
|
if($Index -lt 0 -or $Index -ge @($Current).Count){
|
|
throw "Configuration data reference path [$Path] array index [$Index] is out of range."
|
|
}
|
|
|
|
$Current = @($Current)[$Index]
|
|
continue
|
|
}
|
|
|
|
$Property = $Current.PSObject.Properties[$Segment]
|
|
if($null -eq $Property){
|
|
throw "Configuration data reference path [$Path] was not found. Property [$Segment] is missing."
|
|
}
|
|
|
|
$Current = $Property.Value
|
|
}
|
|
|
|
return $Current
|
|
}
|