42 lines
1.9 KiB
Go
42 lines
1.9 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 !validProfileName(options.Profile) {
|
|
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "profile 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.Profile != "" && options.Profile != "default" {
|
|
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "NoSource cannot select an active profile"))
|
|
}
|
|
if options.Filesystem == nil && (source.kind == sourceBytes || source.kind == sourceReader) && (options.Imports || activeProfile(options.Profile)) {
|
|
diagnostics = append(diagnostics, optionDiagnostic(CodeOptionsInvalid, "byte and reader imports or profiles 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"))
|
|
}
|
|
}
|
|
return options, canonicalDiagnostics(diagnostics)
|
|
}
|
|
|
|
func optionDiagnostic(code Code, message string) Diagnostic {
|
|
return Diagnostic{Code: code, Severity: SeverityError, Message: message}
|
|
}
|