From edd8196e43e69715a7672859e1c6c8db6a2f3eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B4=94=E7=AB=9E=E5=AE=81?= Date: Tue, 13 Dec 2022 10:58:16 +0800 Subject: [PATCH] fix: report json marshal error --- error.go | 2 +- go.mod | 11 ++++++----- report.go | 35 +++++++++++++++++++++++++++++------ report_test.go | 21 +++++++++++++++++++++ 4 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 report_test.go diff --git a/error.go b/error.go index a2eba58..b42ec91 100644 --- a/error.go +++ b/error.go @@ -37,6 +37,6 @@ func (e *Error) UnmarshalJSON(buf []byte) error { return err } - e.Src, e.Dst, e.Err = m.Src, e.Dst, fmt.Errorf(m.Err) + e.Src, e.Dst, e.Err = m.Src, m.Dst, fmt.Errorf(m.Err) return nil } diff --git a/go.mod b/go.mod index f91776f..48a6da6 100644 --- a/go.mod +++ b/go.mod @@ -3,22 +3,23 @@ module github.com/abc950309/acp go 1.18 require ( + github.com/davecgh/go-spew v1.1.1 + github.com/deckarep/golang-set/v2 v2.1.0 github.com/hashicorp/go-multierror v1.1.1 + github.com/json-iterator/go v1.1.12 + github.com/klauspost/cpuid/v2 v2.0.4 github.com/minio/sha256-simd v1.0.0 + github.com/modern-go/reflect2 v1.0.2 github.com/schollz/progressbar/v3 v3.10.1 github.com/sirupsen/logrus v1.9.0 + golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 ) require ( - github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.0.4 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect github.com/rivo/uniseg v0.3.4 // indirect - golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect ) diff --git a/report.go b/report.go index a40f627..c32eeda 100644 --- a/report.go +++ b/report.go @@ -6,8 +6,10 @@ import ( "sync" "unsafe" + "github.com/davecgh/go-spew/spew" jsoniter "github.com/json-iterator/go" "github.com/modern-go/reflect2" + "github.com/sirupsen/logrus" ) type ReportGetter func() *Report @@ -74,20 +76,45 @@ var ( type errValCoder struct{} func (*errValCoder) IsEmpty(ptr unsafe.Pointer) bool { + logrus.Infof("IsEmpty %s", spew.Sdump(ptr)) val := (*error)(ptr) return *val == nil } func (*errValCoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) { + logrus.Infof("Encode %s", spew.Sdump(ptr)) val := (*error)(ptr) stream.WriteString((*val).Error()) } func (*errValCoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) { + logrus.Infof("Decode %s", spew.Sdump(ptr)) val := (*error)(ptr) *val = fmt.Errorf(iter.ReadString()) } +var ( + errorType2 reflect2.Type +) + +type reportJSONExtension struct { + jsoniter.DummyExtension +} + +func (*reportJSONExtension) CreateDecoder(typ reflect2.Type) jsoniter.ValDecoder { + if typ.Implements(errorType2) { + return &errValCoder{} + } + return nil +} + +func (*reportJSONExtension) CreateEncoder(typ reflect2.Type) jsoniter.ValEncoder { + if typ.Implements(errorType2) { + return &errValCoder{} + } + return nil +} + func init() { reportJSON = jsoniter.Config{ EscapeHTML: true, @@ -96,10 +123,6 @@ func init() { }.Froze() var emptyErr error - reportJSON.RegisterExtension(jsoniter.EncoderExtension{ - reflect2.TypeOf(emptyErr): &errValCoder{}, - }) - reportJSON.RegisterExtension(jsoniter.DecoderExtension{ - reflect2.TypeOf(emptyErr): &errValCoder{}, - }) + errorType2 = reflect2.TypeOfPtr(&emptyErr).Elem() + reportJSON.RegisterExtension(&reportJSONExtension{}) } diff --git a/report_test.go b/report_test.go new file mode 100644 index 0000000..9512d40 --- /dev/null +++ b/report_test.go @@ -0,0 +1,21 @@ +package acp + +import ( + "syscall" + "testing" + + "github.com/davecgh/go-spew/spew" + "github.com/modern-go/reflect2" + "github.com/sirupsen/logrus" +) + +func TestErrorJSONMarshal(t *testing.T) { + m := map[string]error{} + m["test"] = syscall.EROFS + + var err error + logrus.Infof("get error type %s", spew.Sdump(reflect2.TypeOfPtr(&err).Elem())) + + buf, _ := reportJSON.Marshal(m) + logrus.Infof("get json %s", buf) +}