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

@ -2572,3 +2572,34 @@ func TestUnmarshalMaxDepth(t *testing.T) {
}
}
}
func TestInvalidUnmarshalErrorIs(t *testing.T) {
err := fmt.Errorf("apackage: %w: failed to parse struct", &InvalidUnmarshalError{reflect.TypeOf("a")})
if !errors.Is(err, &InvalidUnmarshalError{}) {
t.Fatalf("%v should be unwrapped to a InvalidUnmarshalError", err)
}
}
func TestUnmarshalFieldErrorIs(t *testing.T) {
err := fmt.Errorf("apackage: %w: failed to parse struct", &UnmarshalFieldError{
Key: "foo",
Type: reflect.TypeOf("a"),
Field: reflect.StructField{Name: "b"},
})
if !errors.Is(err, &UnmarshalFieldError{}) {
t.Fatalf("%v should be unwrapped to a UnmarshalFieldError", err)
}
}
func TestUnmarshalTypeErrorIs(t *testing.T) {
err := fmt.Errorf("apackage: %w: failed to parse struct", &UnmarshalTypeError{
Value: "foo",
Type: reflect.TypeOf("a"),
Offset: 1,
Struct: "Foo",
Field: "Bar",
})
if !errors.Is(err, &UnmarshalTypeError{}) {
t.Fatalf("%v should be unwrapped to a UnmarshalTypeError", err)
}
}