package http import ( "context" "net/http" "github.com/openmeterio/openmeter/pkg/framework/commonhttp" "github.com/openmeterio/openmeter/pkg/framework/transport/httptransport/encoder" "github.com/openmeterio/openmeter/pkg/models" ) func ValidationErrorEncoder(kind ResourceKind) encoder.ErrorEncoder { return func(ctx context.Context, err error, w http.ResponseWriter, r *http.Request) bool { issues, err := models.AsValidationIssues(err) if err == nil && len(issues) > 0 { err = validationError{ kind: kind, issues: issues, } return commonhttp.HandleErrorIfTypeMatches[validationError](ctx, http.StatusBadRequest, err, w, validationErrorToExtensions) } return false } } var _ error = (*validationError)(nil) type validationError struct { kind ResourceKind issues models.ValidationIssues } func (e validationError) Error() string { return "invalid " + string(e.kind) } func validationErrorToExtensions(err validationError) map[string]interface{} { if len(err.issues) == 0 { return nil } var issues []map[string]interface{} for _, issue := range err.issues { issues = append(issues, issue.AsErrorExtension()) } return map[string]interface{}{ "validationErrors": issues, } }