diff --git a/exports.go b/exports.go index 864fb1193221015e8eab570551b1cc067b5c6d82..5a5a540c3dfa762456492cfe97a05596a922d749 100644 --- a/exports.go +++ b/exports.go @@ -13,7 +13,7 @@ import ( type ( // Conn is used to make requests to jsonrpc2 servers Conn = codec.Conn - // Handler is the equivilant of http.Handler, but for jsonrpc. + // Handler is the equivalent of http.Handler, but for jsonrpc. Handler = codec.Handler // HandlerFunc is a Handler that exists as a function HandlerFunc = codec.HandlerFunc diff --git a/pkg/codec/errors.go b/pkg/codec/errors.go index 6f13598f44ad94dfe016d8c7117b80d8ae28a98b..a8c2f0f6ebef6bf7683778e92f208a8c3915f62d 100644 --- a/pkg/codec/errors.go +++ b/pkg/codec/errors.go @@ -46,15 +46,17 @@ func EncodeError(enc *jx.Encoder, err error) error { enc.Obj(func(e *jx.Encoder) { switch er := err.(type) { case DataError: - data, err := json.Marshal(er.ErrorData()) - if err != nil { - data = []byte(`"failed to marshal error data"`) - } e.Field("code", func(e *jx.Encoder) { e.Int(er.ErrorCode()) }) e.Field("message", func(e *jx.Encoder) { e.Str(er.Error()) }) - e.Field("data", func(e *jx.Encoder) { - e.Raw(data) - }) + if dat := er.ErrorData(); dat != nil { + data, err := json.Marshal(er.ErrorData()) + if err != nil { + data = []byte(`"failed to marshal error data"`) + } + e.Field("data", func(e *jx.Encoder) { + e.Raw(data) + }) + } case Error: e.FieldStart("code") e.Int(er.ErrorCode()) @@ -68,31 +70,30 @@ func EncodeError(enc *jx.Encoder, err error) error { return nil } -type JrpcErr struct { - Data any -} - -func (j *JrpcErr) ErrorData() any { - return j.Data +func WrapErr(data any, code int, err error) error { + return &jrpcErr{ + data: data, + err: err, + code: code, + } } -func (j *JrpcErr) Error() string { - return "Jrpc Error" +type jrpcErr struct { + data any + err error + code int } -func (j *JrpcErr) ErrorCode() int { - return ErrorCodeJrpc +func (j *jrpcErr) ErrorData() any { + return j.data } -func WrapJrpcErr(err error) error { - if err == nil { - return nil - } - return fmt.Errorf("%w: %w", &JrpcErr{}, err) +func (j *jrpcErr) Error() string { + return j.err.Error() } -func MakeJrpcErr(s string) error { - return fmt.Errorf("%w: %s", &JrpcErr{}, s) +func (j *jrpcErr) ErrorCode() int { + return j.code } type ErrorMethodNotFound struct{ method string }