func processErrors()

in code/go/internal/validator/spec.go [105:184]


func processErrors(errs specerrors.ValidationErrors) specerrors.ValidationErrors {
	var processedErrs specerrors.ValidationErrors

	// Rename unclear error messages
	msgTransforms := []struct {
		matcher *regexp.Regexp
		new     string
	}{
		{
			matcher: regexp.MustCompile(`Must not validate the schema \(not\)`),
			new:     "Must not be present",
		},
		{
			matcher: regexp.MustCompile("secret is required"),
			new:     "variable identified as possible secret, secret parameter required to be set to true or false",
		},
		{
			matcher: regexp.MustCompile(`(field processors.[0-9]+.rename): if is required`),
			new:     "%s: rename \"message\" to \"event.original\" processor requires if: 'ctx.event?.original == null'",
		},
		{
			matcher: regexp.MustCompile(`(field processors.[0-9]+): remove is required`),
			new:     "%s: rename \"message\" to \"event.original\" processor requires remove \"message\" processor",
		},
		{
			matcher: regexp.MustCompile(`(processors.[0-9]+.remove.field): processors.[0-9]+.remove.field does not match: "message"`),
			new:     "%s: rename \"message\" to \"event.original\" processor requires remove \"message\" processor",
		},
		{
			matcher: regexp.MustCompile(`(processors.[0-9]+.remove.if): processors.[0-9]+.remove.if does not match: "ctx\.event\?\.original != null"`),
			new:     "%s: rename \"message\" to \"event.original\" processor requires remove \"message\" processor with if: 'ctx.event?.original != null'",
		},
	}

	// Filter out redundant errors
	redundant := []string{
		"Must validate \"then\" as \"if\" was valid",
		"Must validate \"else\" as \"if\" was not valid",
		"Must validate all the schemas (allOf)",
		"Must validate at least one schema (anyOf)",
		"Must validate one and only one schema (oneOf)",
		"At least one of the items must match",
	}

	// Add error code to specific errors
	addErrorCode := []struct {
		matcher *regexp.Regexp
		code    string
	}{
		{
			matcher: regexp.MustCompile(`rename "message" to "event.original" processor`),
			code:    specerrors.MessageRenameToEventOriginalValidation,
		},
	}

	for _, e := range errs {
		for _, msg := range msgTransforms {
			if match := msg.matcher.FindStringSubmatch(e.Error()); len(match) > 1 {
				e = specerrors.NewStructuredError(
					errors.New(strings.Replace(e.Error(), match[0], fmt.Sprintf(msg.new, match[1]), 1)),
					specerrors.UnassignedCode)
			} else if msg.matcher.MatchString(e.Error()) {
				e = specerrors.NewStructuredError(
					errors.New(strings.Replace(e.Error(), msg.matcher.FindString(e.Error()), msg.new, 1)),
					specerrors.UnassignedCode)
			}
		}
		for _, transform := range addErrorCode {
			if transform.matcher.MatchString(e.Error()) {
				e = specerrors.NewStructuredError(e, transform.code)
			}
		}
		if substringInSlice(e.Error(), redundant) {
			continue
		}
		processedErrs = append(processedErrs, e)
	}

	return processedErrs
}