core/private/Get-JaxLibraryEntities.ps1
|
function Get-JaxLibraryEntities { [CmdletBinding()] param ( [string] $RepoRoot = (Get-JaxRepoRoot), [string] $EnvDir, [System.Collections.IDictionary] $Config, [switch] $NoCache ) $commonParams = Get-JaxCommonParameters -BoundParameters $PSBoundParameters Write-Debug "FUNC: $($MyInvocation.MyCommand.Name) Args: $($PSBoundParameters | ConvertTo-Json -Depth 1 -Compress -WarningAction SilentlyContinue)" if ([string]::IsNullOrWhiteSpace($EnvDir)) { return @() } if ($null -eq $Config) { $Config = Get-JaxConfig -RepoRoot $RepoRoot @commonParams } $paths = Get-JaxEnvHierarchyPaths -RepoRoot $RepoRoot -Config $Config -EnvDir $EnvDir @commonParams $dirName = 'scenarios-lib' if ($Config.scenarioLibDirName) { $dirName = $Config.scenarioLibDirName } $seenFiles = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) $entities = @() $discoveredKeys = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) $scenarioLibrary = @{} $context = @{ RepoRoot = $RepoRoot EnvDir = $EnvDir Config = $Config } foreach ($path in $paths) { $libraryDir = Join-Path $path $dirName if (-not (Test-Path -Path $libraryDir -PathType Container)) { continue } $files = @(Get-ChildItem -Path $libraryDir -Filter '*.yml' -File -Recurse -ErrorAction SilentlyContinue) $files += @(Get-ChildItem -Path $libraryDir -Filter '*.yaml' -File -Recurse -ErrorAction SilentlyContinue) foreach ($file in $files) { if (-not $seenFiles.Add($file.FullName)) { continue } try { $content = Get-Content -Path $file.FullName -Raw -ErrorAction Stop $yaml = ConvertFrom-Yaml $content -AllDocuments:$false -Ordered if ($yaml -is [System.Collections.IDictionary]) { # Make the current library available for resolvers that need cross-references (e.g. bob-library). $scenarioLibrary = Merge-JaxHashtable -Base $scenarioLibrary -Overlay $yaml @commonParams $context['ScenarioLibrary'] = $scenarioLibrary foreach ($key in $yaml.Keys) { # Ignore keys starting with lib_ (conventions?) if ($key.ToString().StartsWith('lib_')) { continue } if ($discoveredKeys.Add($key)) { $val = $yaml[$key] try { $entity = Convert-JaxScenarioItemToRunEntity -Key $key -Value $val -ScenarioName "Library:$key" -ProvenancePath $file.FullName -Context $context @commonParams $entities += $entity } catch { # Fallback: create stub if resolution fails (e.g. missing referenced libs during discovery) # Write-Warning "Discovery (Partial): $key ($($file.Name))" $entities += New-JaxRunEntity -Key $key -ScenarioName "Library:$key" -ProvenancePath $file.FullName @commonParams } } } } } catch { Write-Warning "Failed to parse library file '$($file.FullName)': $_" } } } return $entities } |