encoding/json: implement Is on all errors

Allows users to check:

      errors.Is(err, &UnmarshalTypeError{})
      errors.Is(err, &UnmarshalFieldError{})
      errors.Is(err, &InvalidUnmarshalError{})
      errors.Is(err, &UnsupportedValueError{})
      errors.Is(err, &MarshalerError{})

which is the recommended way of checking for kinds of errors.

SyntaxError.Is was implemented in CL 253037.
As and Unwrap relevant methods will be added in future CLs.

Change-Id: I1f8a503b8fdc0f3afdfe9669a91f3af8d960e028
GitHub-Last-Rev: 930cda5384
GitHub-Pull-Request: golang/go#41360
Reviewed-on: https://go-review.googlesource.com/c/go/+/254537
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Trust: Emmanuel Odeke <emm.odeke@gmail.com>
This commit is contained in:
Carlos Alexandro Becker 2020-09-13 02:12:02 +00:00 committed by Emmanuel Odeke
parent b3ef90ec73
commit 95bb00d108
4 changed files with 84 additions and 1 deletions

View file

@ -136,6 +136,12 @@ func (e *UnmarshalTypeError) Error() string {
return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String()
}
// Is returns true if target is a UnmarshalTypeError.
func (e *UnmarshalTypeError) Is(target error) bool {
_, ok := target.(*UnmarshalTypeError)
return ok
}
// An UnmarshalFieldError describes a JSON object key that
// led to an unexported (and therefore unwritable) struct field.
//
@ -150,12 +156,24 @@ func (e *UnmarshalFieldError) Error() string {
return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String()
}
// Is returns true if target is a UnmarshalFieldError.
func (e *UnmarshalFieldError) Is(target error) bool {
_, ok := target.(*UnmarshalFieldError)
return ok
}
// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal.
// (The argument to Unmarshal must be a non-nil pointer.)
type InvalidUnmarshalError struct {
Type reflect.Type
}
// Is returns true if target is a InvalidUnmarshalError.
func (e *InvalidUnmarshalError) Is(target error) bool {
_, ok := target.(*InvalidUnmarshalError)
return ok
}
func (e *InvalidUnmarshalError) Error() string {
if e.Type == nil {
return "json: Unmarshal(nil)"