From e19facdded3caf047d2990aa3533a0c0eae205d0 Mon Sep 17 00:00:00 2001 From: Andrey Beletsky Date: Wed, 15 Jun 2022 00:47:30 +0700 Subject: [PATCH] Add metadata to error returned by jsonrpc --- extras/jsonrpc/daemon.go | 28 +++++++++++++++++++++++++++- extras/jsonrpc/daemon_test.go | 12 ++++++++---- go.mod | 1 - go.sum | 11 ----------- 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/extras/jsonrpc/daemon.go b/extras/jsonrpc/daemon.go index 82ddc36..5def9ce 100644 --- a/extras/jsonrpc/daemon.go +++ b/extras/jsonrpc/daemon.go @@ -20,11 +20,24 @@ import ( const DefaultPort = 5279 +const ( + ErrorWalletNotLoaded = "WalletNotLoadedError" + ErrorWalletAlreadyLoaded = "WalletAlreadyLoadedError" + ErrorWalletNotFound = "WalletNotFoundError" + ErrorWalletAlreadyExists = "WalletAlreadyExistsError" +) + type Client struct { conn jsonrpc.RPCClient address string } +type Error struct { + Code int + Name string + Message string +} + func NewClient(address string) *Client { d := Client{} @@ -70,6 +83,15 @@ func Decode(data interface{}, targetStruct interface{}) error { return nil } +// WrapError adds error metadata from JSONRPC error response for clients to access +func WrapError(rpcError *jsonrpc.RPCError) Error { + e := Error{Code: rpcError.Code, Message: rpcError.Message} + if d, ok := rpcError.Data.(map[string]interface{}); ok { + e.Name = d["name"].(string) + } + return e +} + func decodeNumber(data interface{}) (decimal.Decimal, error) { var number string @@ -106,6 +128,10 @@ func debugParams(params map[string]interface{}) string { return strings.Join(s, " ") } +func (e Error) Error() string { + return fmt.Sprintf("Error in daemon: %s", e.Message) +} + func (d *Client) callNoDecode(command string, params map[string]interface{}) (interface{}, error) { log.Debugln("jsonrpc: " + command + " " + debugParams(params)) r, err := d.conn.Call(command, params) @@ -114,7 +140,7 @@ func (d *Client) callNoDecode(command string, params map[string]interface{}) (in } if r.Error != nil { - return nil, errors.Err("Error in daemon: " + r.Error.Message) + return nil, WrapError(r.Error) } return r.Result, nil diff --git a/extras/jsonrpc/daemon_test.go b/extras/jsonrpc/daemon_test.go index d5b629a..1386ef9 100644 --- a/extras/jsonrpc/daemon_test.go +++ b/extras/jsonrpc/daemon_test.go @@ -750,11 +750,15 @@ func TestClient_WalletList(t *testing.T) { d := NewClient("") id := "lbry#wallet#id:" + fmt.Sprintf("%d", rand.Int()) - wList, err := d.WalletList(id, 1, 20) + _, err := d.WalletList(id, 1, 20) if err == nil { t.Fatalf("wallet %v was unexpectedly found", id) } - if !strings.Contains(err.Error(), fmt.Sprintf("Couldn't find wallet: %v.", id)) { + derr, ok := err.(Error) + if !ok { + t.Fatalf("unknown error returned: %s", err) + } + if derr.Name != ErrorWalletNotLoaded { t.Fatal(err) } @@ -763,7 +767,7 @@ func TestClient_WalletList(t *testing.T) { t.Fatal(err) } - wList, err = d.WalletList(id, 1, 20) + wList, err := d.WalletList(id, 1, 20) if err != nil { t.Fatal(err) } @@ -800,7 +804,7 @@ func TestClient_WalletRemoveWalletAdd(t *testing.T) { } func TestClient_TransactionSummary(t *testing.T) { - d := NewClient("https://api.lbry.tv/api/v1/proxy") + d := NewClient("https://api.na-backend.odysee.com/api/v1/proxy") r, err := d.TransactionShow("d104a1616c6af581e2046819de678f370d624e97cf176f95acaec4b183a42db6") if err != nil { t.Error(err) diff --git a/go.mod b/go.mod index 2823821..ca6b669 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,6 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/smartystreets/assertions v1.0.1 // indirect github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 // indirect - github.com/stretchr/objx v0.1.0 // indirect golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 // indirect google.golang.org/appengine v1.4.0 // indirect google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 // indirect diff --git a/go.sum b/go.sum index cbdc74f..f1703a8 100644 --- a/go.sum +++ b/go.sum @@ -67,8 +67,6 @@ github.com/lbryio/types v0.0.0-20201019032447-f0b4476ef386 h1:JOQkGpeCM9FWkEHRx+ github.com/lbryio/types v0.0.0-20201019032447-f0b4476ef386/go.mod h1:CG3wsDv5BiVYQd5i1Jp7wGsaVyjZTJshqXeWMVKsISE= github.com/lyoshenka/bencode v0.0.0-20180323155644-b7abd7672df5 h1:mG83tLXWSRdcXMWfkoumVwhcCbf3jHF9QKv/m37BkM0= github.com/lyoshenka/bencode v0.0.0-20180323155644-b7abd7672df5/go.mod h1:H0aPCWffGOaDcjkw1iB7W9DVLp6GXmfcJY/7YZCWPA4= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -84,8 +82,6 @@ github.com/sebdah/goldie v0.0.0-20190531093107-d313ffb52c77 h1:Msb6XRY62jQOueNNl github.com/sebdah/goldie v0.0.0-20190531093107-d313ffb52c77/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shopspring/decimal v0.0.0-20191009025716-f1972eb1d1f5 h1:Gojs/hac/DoYEM7WEICT45+hNWczIeuL5D21e5/HPAw= -github.com/shopspring/decimal v0.0.0-20191009025716-f1972eb1d1f5/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= @@ -97,20 +93,13 @@ github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHei github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/ybbus/jsonrpc v0.0.0-20180411222309-2a548b7d822d h1:tQo6hjclyv3RHUgZOl6iWb2Y44A/sN9bf9LAYfuioEg= -github.com/ybbus/jsonrpc v0.0.0-20180411222309-2a548b7d822d/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= github.com/ybbus/jsonrpc v2.1.2+incompatible h1:V4mkE9qhbDQ92/MLMIhlhMSbz8jNXdagC3xBR5NDwaQ= github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= -- 2.45.2