47 lines
2.5 KiB
Go
47 lines
2.5 KiB
Go
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]
|
|
}
|
|
var diagnostics []Diagnostic
|
|
definition := options.Definition
|
|
if !validOverlayName(options.Overlay) {
|
|
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "overlay name must contain only ASCII letters, digits, underscore, or hyphen"))
|
|
}
|
|
if options.Filesystem != nil {
|
|
diagnostics = append(diagnostics, filesystemOptionDiagnostics(source, options.Filesystem)...)
|
|
}
|
|
if source.kind == sourceNone && options.Imports {
|
|
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "NoSource cannot enable imports"))
|
|
}
|
|
if source.kind == sourceNone && options.Overlay != "" && options.Overlay != "default" {
|
|
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "NoSource cannot select an active overlay"))
|
|
}
|
|
if options.Filesystem == nil && (source.kind == sourceBytes || source.kind == sourceReader || source.kind == sourceMapping) && (options.Imports || activeOverlay(options.Overlay)) {
|
|
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "synthetic-source imports or overlays require filesystem context"))
|
|
}
|
|
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 options.SourceVersionMode != sourceVersionModeDefault && options.SourceVersionMode != sourceVersionModeIfPresent && options.SourceVersionMode != 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) {
|
|
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "source-version checking requires a valid version rule and checker"))
|
|
}
|
|
return options, canonicalDiagnostics(diagnostics)
|
|
}
|
|
|
|
func optionDiagnostic(code Code, message string) Diagnostic {
|
|
return Diagnostic{Code: code, Severity: SeverityError, Message: message}
|
|
}
|