package engine import "gitea.maximumdirect.net/eric/ConfigKit/internal/document" // assembledInput is the source/document handoff across schema and version checks. type assembledInput struct { parsed parsedSource document *document.Node composition *composedDocument sources []SourceInfo } func assembleBaseInput[T any](source Source, options Options[T]) (assembledInput, []Diagnostic) { parsed, diagnostics := parseSource(source, "source-1", defaultParseLimits()) input := assembledInput{parsed: parsed, document: parsed.document} if len(diagnostics) != 0 { input.sources = sourceInfos(parsed.source) return input, diagnostics } if options.Imports { input.composition, input.sources, diagnostics = loadImportedDocuments(source, options.Filesystem, parsed, options.Definition.Version, defaultImportLimits()) if len(diagnostics) != 0 { return input, diagnostics } input.document = input.composition.root } else { input.sources = sourceInfos(parsed.source) if options.Filesystem != nil && !activeOverlay(options.Overlay) { if diagnostic := validateFilesystemContext(source, options.Filesystem, parsed); diagnostic != nil { return input, []Diagnostic{*diagnostic} } } } if !options.Imports && input.document != nil { if diagnostics := disabledDirectiveDiagnostics(input.document, Path{}); len(diagnostics) != 0 { return input, diagnostics } } return input, nil } func applyInputLayers[T any](source Source, options Options[T], input assembledInput) (assembledInput, []Diagnostic) { if !activeOverlay(options.Overlay) && len(options.Overrides) == 0 { return input, nil } composition, diagnostics := compositionForInput(input) if len(diagnostics) != 0 { return input, diagnostics } if activeOverlay(options.Overlay) { composition, input.sources, diagnostics = loadSelectedOverlayDocument( source, options.Filesystem, input.parsed, composition, input.sources, options.Overlay, options.Definition.Version, defaultImportLimits(), ) if len(diagnostics) != 0 { return input, diagnostics } } if len(options.Overrides) != 0 { composition, input.sources, diagnostics = applyOverrides( composition, input.sources, options.Overrides, options.Definition.Version, defaultImportLimits(), ) if len(diagnostics) != 0 { return input, diagnostics } } input.composition = composition input.document = composition.root return input, nil } // compositionForInput initializes one handoff for overlays and CLI, including // defaults-only CLI input. Raw source bytes and mapping keys retain their budgets. func compositionForInput(input assembledInput) (*composedDocument, []Diagnostic) { if input.composition != nil { return input.composition, nil } if input.document == nil { return &composedDocument{root: &document.Node{Kind: document.Mapping}, origins: make(map[string]Origin)}, nil } composition, diagnostics := composeDocuments(input.document) if len(diagnostics) != 0 { return nil, diagnostics } composition.inputBytes = input.parsed.bytes composition.inputNodes = countInputNodes(input.document) return composition, nil }