mirror of
https://github.com/linka-cloud/grpc.git
synced 2024-11-25 12:26:26 +00:00
validation: recursive error check on "embedded message failed validation"
Signed-off-by: Adphi <philippe.adrien.nousse@gmail.com>
This commit is contained in:
parent
5662486b3b
commit
79771e58c1
@ -38,10 +38,24 @@ type validatorError interface {
|
|||||||
ErrorName() string
|
ErrorName() string
|
||||||
}
|
}
|
||||||
|
|
||||||
func validatorErrorToGrpc(e validatorError) *errdetails.BadRequest_FieldViolation {
|
func validatorErrorToGrpc(e validatorError, prefix string) []*errdetails.BadRequest_FieldViolation {
|
||||||
return &errdetails.BadRequest_FieldViolation{
|
// check nested errors for validation error, e.g. "embedded message failed validation"
|
||||||
Field: e.Field(),
|
switch v := e.Cause().(type) {
|
||||||
|
case validatorError:
|
||||||
|
return validatorErrorToGrpc(v, e.Field()+".")
|
||||||
|
case validatorMultiError:
|
||||||
|
var details []*errdetails.BadRequest_FieldViolation
|
||||||
|
for _, vv := range v.AllErrors() {
|
||||||
|
if ee, ok := vv.(validatorError); ok {
|
||||||
|
details = append(details, validatorErrorToGrpc(ee, e.Field()+".")...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return details
|
||||||
|
default:
|
||||||
|
return []*errdetails.BadRequest_FieldViolation{{
|
||||||
|
Field: prefix + e.Field(),
|
||||||
Description: e.Reason(),
|
Description: e.Reason(),
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,12 +65,12 @@ func errToStatus(err error) error {
|
|||||||
}
|
}
|
||||||
switch v := err.(type) {
|
switch v := err.(type) {
|
||||||
case validatorError:
|
case validatorError:
|
||||||
return errors.InvalidArgumentd(err, &errdetails.BadRequest{FieldViolations: []*errdetails.BadRequest_FieldViolation{validatorErrorToGrpc(v)}})
|
return errors.InvalidArgumentd(err, &errdetails.BadRequest{FieldViolations: validatorErrorToGrpc(v, "")})
|
||||||
case validatorMultiError:
|
case validatorMultiError:
|
||||||
details := &errdetails.BadRequest{}
|
details := &errdetails.BadRequest{}
|
||||||
for _, v := range v.AllErrors() {
|
for _, v := range v.AllErrors() {
|
||||||
if d, ok := v.(validatorError); ok {
|
if d, ok := v.(validatorError); ok {
|
||||||
details.FieldViolations = append(details.FieldViolations, validatorErrorToGrpc(d))
|
details.FieldViolations = append(details.FieldViolations, validatorErrorToGrpc(d, "")...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return errors.InvalidArgumentd(err, details)
|
return errors.InvalidArgumentd(err, details)
|
||||||
|
Loading…
Reference in New Issue
Block a user