Normalize ordinary and grouped load preflight
This commit is contained in:
@@ -1,52 +1,52 @@
|
||||
package engine
|
||||
|
||||
func selectOptions[T any](source Source, supplied []Options[T]) (Options[T], []Diagnostic) {
|
||||
if len(supplied) > 1 {
|
||||
return Options[T]{}, []Diagnostic{optionDiagnostic(CodeOptionsInvalid, "Load accepts at most one options value")}
|
||||
}
|
||||
var options Options[T]
|
||||
if len(supplied) == 1 {
|
||||
options = supplied[0]
|
||||
}
|
||||
options.importDefaults = snapshotImportDefaults(options.importDefaults)
|
||||
func normalizeInput(input loadInput, ordinaryOverlay string) (loadInput, []Diagnostic) {
|
||||
var diagnostics []Diagnostic
|
||||
if !options.importDefaultsValidated {
|
||||
diagnostics = validateImportDefaults(options.importDefaults)
|
||||
}
|
||||
if options.placementMode != placementModeMapping && options.placementMode != placementModeSequenceItem {
|
||||
if input.placementMode != placementModeMapping && input.placementMode != placementModeSequenceItem {
|
||||
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "input placement mode is invalid"))
|
||||
}
|
||||
if normalized, err := normalizeDestination(options.destination); err != nil {
|
||||
diagnostics = append(diagnostics, invalidDestinationDiagnostic(options.destination))
|
||||
if normalized, err := normalizeDestination(input.destination); err != nil {
|
||||
diagnostics = append(diagnostics, invalidDestinationDiagnostic(input.destination))
|
||||
} else {
|
||||
options.destination = normalized
|
||||
input.destination = normalized
|
||||
}
|
||||
if options.placementMode == placementModeSequenceItem && len(options.destination.segments) == 0 {
|
||||
if input.placementMode == placementModeSequenceItem && len(input.destination.segments) == 0 {
|
||||
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "sequence-item placement requires a nonempty destination"))
|
||||
}
|
||||
definition := options.Definition
|
||||
if !validOverlayName(options.Overlay) {
|
||||
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "overlay name must contain only ASCII letters, digits, underscore, or hyphen"))
|
||||
if input.filesystem != nil {
|
||||
diagnostics = append(diagnostics, filesystemOptionDiagnostics(input.source, input.filesystem)...)
|
||||
}
|
||||
if options.Filesystem != nil {
|
||||
diagnostics = append(diagnostics, filesystemOptionDiagnostics(source, options.Filesystem)...)
|
||||
}
|
||||
if source.kind == sourceSearch {
|
||||
for _, issue := range source.searchIssues {
|
||||
if input.source.kind == sourceSearch {
|
||||
for _, issue := range input.source.searchIssues {
|
||||
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, issue))
|
||||
}
|
||||
if source.search == nil {
|
||||
if input.source.search == nil {
|
||||
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "configuration search is invalid"))
|
||||
} else {
|
||||
diagnostics = append(diagnostics, validateSearch(*source.search, source.searchApp)...)
|
||||
diagnostics = append(diagnostics, validateSearch(*input.source.search, input.source.searchApp)...)
|
||||
}
|
||||
}
|
||||
if source.kind == sourceNone && activeOverlay(options.Overlay) && options.Filesystem == nil {
|
||||
if input.source.kind == sourceNone && activeOverlay(ordinaryOverlay) && input.filesystem == nil {
|
||||
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "NoSource overlays require explicit filesystem context"))
|
||||
}
|
||||
if options.Filesystem == nil && (source.kind == sourceBytes || source.kind == sourceReader || source.kind == sourceMapping) && (options.Imports || activeOverlay(options.Overlay)) {
|
||||
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"))
|
||||
@@ -55,12 +55,19 @@ func selectOptions[T any](source Source, supplied []Options[T]) (Options[T], []D
|
||||
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "schema-version rule requires a checker"))
|
||||
}
|
||||
}
|
||||
if options.SourceVersionMode != sourceVersionModeDefault && options.SourceVersionMode != sourceVersionModeIfPresent && options.SourceVersionMode != sourceVersionModeRequired {
|
||||
if mode != sourceVersionModeDefault && mode != sourceVersionModeIfPresent && mode != sourceVersionModeRequired {
|
||||
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "source-version mode is invalid"))
|
||||
} else if options.SourceVersionMode != sourceVersionModeDefault && (definition.Version == nil || !definition.Version.Path.valid() || definition.Version.Check == nil) {
|
||||
} 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 options, canonicalDiagnostics(diagnostics)
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user