scripts/Merge-MetaData.ps1
function Merge-Metadata { [CmdletBinding()] param ( [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)] [hashtable]$config, [Parameter(Position = 1, Mandatory = $false)] [object]$metadata = $null, [Parameter(Position = 2, Mandatory = $false)] [object[]]$tasks = @(), [Parameter(Position = 3, Mandatory = $false)] [string]$yamlPath = "$PSScriptRoot\..\..\pwshake.yaml" ) process { if (-not $config['attributes']) { $config.attributes = @{} } if ($metadata) { if ($metadata -is [Hashtable]) { $config['attributes'] = Merge-Hashtables $config['attributes'] $metadata } elseif ($metadata -is [string]) { $string = "" if (Test-Path $metadata) { if ((Split-Path $metadata -Leaf).EndsWith('.yaml') -or (Split-Path $metadata -Leaf).EndsWith('.json')) { $metadata = $metadata | Normalize-Yaml } elseif (!(Split-Path $metadata -Leaf).Contains('.')) { foreach ($item in (Get-Content -Path $metadata)) { if (-not $item.StartsWith('#')) { $string += "$([regex]::Escape($item))`n" } } $metadata = $string | ConvertFrom-StringData } } elseif ($metadata -match '^{.+}$') { $metadata = $metadata | ConvertFrom-Yaml } else { foreach ($item in ($metadata -split '\n')) { $string += "$([Regex]::Escape($item))`n" } $metadata = $string | ConvertFrom-StringData } $config['attributes'] = Merge-Hashtables $config['attributes'] $metadata } else { throw "`$metadata.GetType() = '$($metadata.GetType())' is unknown." } } if ($tasks) { $config.invoke_tasks = $tasks } return $config } } |