in pkg/tasks/lint/validate.go [60:128]
func (t *ValidateTask) Run(ctx context.Context) error {
var (
reader io.Reader
err error
)
// Create input reader
reader, err = t.SourceReader(ctx)
if err != nil {
return fmt.Errorf("unable to read input reader: %w", err)
}
// Drain input reader
payload, err := io.ReadAll(reader)
if err != nil {
return fmt.Errorf("unable to drain input reader: %w", err)
}
// Detect the appropriate schema
if t.Schema == "" {
// Decode as YAML any object
var specBody fileSpec
if errYaml := yaml.Unmarshal(payload, &specBody); errYaml != nil {
return fmt.Errorf("unable to decode spec as YAML: %w", err)
}
// Check API Version
if specBody.APIVersion != "harp.elastic.co/v1" {
return fmt.Errorf("unsupported YAML file format '%s'", specBody.APIVersion)
}
// Assign detected kind
t.Schema = specBody.Kind
}
// Select lint strategy
s, ok := schemaRegistry[t.Schema]
if !ok {
return fmt.Errorf("unsupported schema definition for '%s'", t.Schema)
}
// Create output writer
writer, err := t.OutputWriter(ctx)
if err != nil {
return fmt.Errorf("unable to open output bundle: %w", err)
}
// Display jsonschema
if t.SchemaOnly {
fmt.Fprintln(writer, string(s.Definition))
return nil
}
// Execute the lint evaluation
validationErrors, err := s.LintFunc(bytes.NewReader(payload))
switch {
case len(validationErrors) > 0:
for _, e := range validationErrors {
fmt.Fprintf(writer, " - %s\n", e.String())
}
return err
case err != nil:
return fmt.Errorf("unexpected validation error occurred: %w", err)
default:
}
// No error
return nil
}