package engine func normalizeInput(input loadInput, ordinaryOverlay string) (loadInput, []Diagnostic) { var diagnostics []Diagnostic if input.placementMode != placementModeMapping && input.placementMode != placementModeSequenceItem { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "input placement mode is invalid")) } if normalized, err := normalizeDestination(input.destination); err != nil { diagnostics = append(diagnostics, invalidDestinationDiagnostic(input.destination)) } else { input.destination = normalized } if input.placementMode == placementModeSequenceItem && len(input.destination.segments) == 0 { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "sequence-item placement requires a nonempty destination")) } if input.filesystem != nil { diagnostics = append(diagnostics, filesystemOptionDiagnostics(input.source, input.filesystem)...) } if input.source.kind == sourceSearch { for _, issue := range input.source.searchIssues { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, issue)) } if input.source.search == nil { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "configuration search is invalid")) } else { diagnostics = append(diagnostics, validateSearch(*input.source.search, input.source.searchApp)...) } } if input.source.kind == sourceNone && activeOverlay(ordinaryOverlay) && input.filesystem == nil { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "NoSource overlays require explicit filesystem context")) } if input.filesystem == nil && (input.source.kind == sourceBytes || input.source.kind == sourceReader || input.source.kind == sourceMapping) && (input.imports || activeOverlay(ordinaryOverlay)) { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "synthetic-source imports or overlays require filesystem context")) } return input, canonicalDiagnostics(diagnostics) } func loadSettings[T any](defaults importDefaults, definition Definition[T], mode sourceVersionMode) (importDefaults, sequencePolicy, []Diagnostic) { defaults = snapshotImportDefaults(defaults) var diagnostics []Diagnostic diagnostics = append(diagnostics, validateImportDefaults(defaults)...) diagnostics = append(diagnostics, sourceVersionOptionDiagnostics(definition, mode)...) policy, policyDiagnostics := compileSequenceIdentityPolicy(definition.sequenceIdentityRegistrations) diagnostics = append(diagnostics, policyDiagnostics...) return defaults, policy, canonicalDiagnostics(diagnostics) } func sourceVersionOptionDiagnostics[T any](definition Definition[T], mode sourceVersionMode) []Diagnostic { var diagnostics []Diagnostic if definition.Version != nil { if !definition.Version.Path.valid() { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "schema-version path is invalid")) } if definition.Version.Check == nil { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "schema-version rule requires a checker")) } } if mode != sourceVersionModeDefault && mode != sourceVersionModeIfPresent && mode != sourceVersionModeRequired { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "source-version mode is invalid")) } else if mode != sourceVersionModeDefault && (definition.Version == nil || !definition.Version.Path.valid() || definition.Version.Check == nil) { diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "source-version checking requires a valid version rule and checker")) } return diagnostics } func overlayOptionDiagnostics(name string) []Diagnostic { if validOverlayName(name) { return nil } return []Diagnostic{optionDiagnostic(CodeOptionsInvalid, "overlay name must contain only ASCII letters, digits, underscore, or hyphen")} } func optionDiagnostic(code Code, message string) Diagnostic { return Diagnostic{Code: code, Severity: SeverityError, Message: message} }