File size: 1,237 Bytes
d6f631f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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,
}
}
|