Provide passive per-source resource contexts

This commit is contained in:
2026-09-29 18:08:27 +00:00
parent 5a77728a81
commit 36362ee6af
16 changed files with 752 additions and 13 deletions

View File

@@ -78,6 +78,7 @@ type Loaded[T any] struct {
type Inspection struct {
metadata Metadata
sources []SourceInfo
contexts map[string]ResourceContext
diagnostics []Diagnostic
baseline *document.Node
input *document.Node
@@ -105,6 +106,16 @@ func (r *Inspection) Sources() []SourceInfo {
return cloneSourceInfos(r.sources)
}
// SourceContext returns a passive filesystem view for an acquired source.
// Unknown IDs and sources without a filesystem context return false.
func (r *Inspection) SourceContext(id string) (ResourceContext, bool) {
if r == nil {
return ResourceContext{}, false
}
context, ok := r.contexts[id]
return context, ok
}
// Diagnostics returns detached nonfatal diagnostics from the load.
func (r *Inspection) Diagnostics() []Diagnostic {
if r == nil {
@@ -167,6 +178,22 @@ func executeLoadRequest[T any](request loadRequest[T], secrets SecretBinding, lo
if len(diagnostics) != 0 {
return nil, accumulator.loadError()
}
if request.ordinary && input.parsed.source != nil {
baseSources := make([]SourceInfo, 0, len(input.sources))
for _, source := range input.sources {
if source.Layer == LayerBase {
baseSources = append(baseSources, source)
}
}
if len(baseSources) != 0 && input.contexts[baseSources[0].ID].FS == nil {
contexts, diagnostic := contextsForAcquiredSources(request.main.source, request.main.filesystem, input.parsed.source, baseSources)
if diagnostic != nil {
accumulator.add(*diagnostic)
return nil, accumulator.loadError()
}
mergeResourceContexts(&input.contexts, contexts)
}
}
decoded, diagnostics := decodeLoadInput(schema, request.definition, input)
accumulator.add(diagnostics...)