Skip to content

Commit 78d7391

Browse files
refactor(xrpl): custom errors
1 parent 3b2e649 commit 78d7391

31 files changed

+339
-224
lines changed

binary-codec/quality_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func TestQualityCodec_Encode(t *testing.T) {
2222
{
2323
name: "fail - invalid quality - invalid character",
2424
input: "invalid",
25-
expectedErr: bigdecimal.ErrInvalidCharacter,
25+
expectedErr: bigdecimal.ErrInvalidCharacter{Allowed: bigdecimal.AllowedCharacters},
2626
},
2727
{
2828
name: "fail - invalid quality - overflow",

binary-codec/types/amount_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ func TestSerializeIssuedCurrencyAmount(t *testing.T) {
427427
inputCurrency: "USD",
428428
inputIssuer: "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
429429
expected: nil,
430-
expectedErr: fmt.Errorf("%w: only the following are allowed: %q", bigdecimal.ErrInvalidCharacter, bigdecimal.AllowedCharacters),
430+
expectedErr: bigdecimal.ErrInvalidCharacter{Allowed: bigdecimal.AllowedCharacters},
431431
},
432432
{
433433
name: "fail - invalid currency code",

pkg/big-decimal/big_decimal.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
package bigdecimal
33

44
import (
5-
"fmt"
65
"math/big"
76
"regexp"
87
"strconv"
@@ -68,7 +67,9 @@ func NewBigDecimal(value string) (bd *BigDecimal, err error) {
6867

6968
// check if the value string contains only allowed characters
7069
if !bigDecimalRegEx(value) {
71-
return nil, fmt.Errorf("%w: only the following are allowed: %q", ErrInvalidCharacter, AllowedCharacters)
70+
return nil, ErrInvalidCharacter{
71+
Allowed: AllowedCharacters,
72+
}
7273

7374
}
7475

pkg/big-decimal/big_decimal_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -650,25 +650,25 @@ func TestNewBigDecimal(t *testing.T) {
650650
name: "contains invalid chars",
651651
input: "12345678r90.1234567890a",
652652
expBigDec: nil,
653-
expErr: ErrInvalidCharacter,
653+
expErr: ErrInvalidCharacter{Allowed: AllowedCharacters},
654654
},
655655
{
656656
name: "contains multiple decimal points",
657657
input: "12345678.90.1234567890",
658658
expBigDec: nil,
659-
expErr: ErrInvalidCharacter,
659+
expErr: ErrInvalidCharacter{Allowed: AllowedCharacters},
660660
},
661661
{
662662
name: "contains multiple 'e' or 'E'",
663663
input: "12345678e90E1234567890",
664664
expBigDec: nil,
665-
expErr: ErrInvalidCharacter,
665+
expErr: ErrInvalidCharacter{Allowed: AllowedCharacters},
666666
},
667667
{
668668
name: "contains multiple '-' signs: excluding the exponent sign",
669669
input: "-1234-567890.1234567890e-9",
670670
expBigDec: nil,
671-
expErr: ErrInvalidCharacter,
671+
expErr: ErrInvalidCharacter{Allowed: AllowedCharacters},
672672
},
673673
}
674674
for _, tc := range tt {

pkg/big-decimal/errors.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,20 @@ package bigdecimal
22

33
import (
44
"errors"
5+
"fmt"
56
)
67

78
var (
8-
// ErrInvalidCharacter is returned when a string contains disallowed characters.
9-
ErrInvalidCharacter = errors.New("value contains invalid characters")
109
// ErrInvalidZeroValue indicates the value string represents zero or is invalid zero.
1110
ErrInvalidZeroValue = errors.New("value cannot be zero")
1211
)
12+
13+
// ErrInvalidCharacter is returned when a string contains disallowed characters.
14+
type ErrInvalidCharacter struct {
15+
Allowed string
16+
}
17+
18+
// Error implements the error interface for ErrInvalidCharacter
19+
func (e ErrInvalidCharacter) Error() string {
20+
return fmt.Sprintf("value contains invalid character: sonly the following are allowed: %s", e.Allowed)
21+
}

xrpl/faucet/devnet.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,28 @@ func (fp *DevnetFaucetProvider) FundWallet(address types.Address) error {
4040
jsonPayload, err := json.Marshal(payload)
4141

4242
if err != nil {
43-
return fmt.Errorf("%w: %v", ErrMarshalPayload, err)
43+
return ErrMarshalPayload{
44+
Err: err,
45+
}
4446
}
4547

4648
req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(jsonPayload))
4749
if err != nil {
48-
return fmt.Errorf("%w: %v", ErrCreateRequest, err)
50+
return ErrCreateRequest{Err: err}
4951
}
5052
req.Header.Set("Content-Type", "application/json")
5153

5254
resp, err := http.DefaultClient.Do(req)
5355
if err != nil {
54-
return fmt.Errorf("%w: %v", ErrSendRequest, err)
56+
return ErrSendRequest{Err: err}
5557
}
5658
defer func() {
5759
_ = resp.Body.Close()
5860
}()
5961
if resp.StatusCode != http.StatusOK {
60-
return fmt.Errorf("%w: %d", ErrUnexpectedStatusCode, resp.StatusCode)
62+
return ErrUnexpectedStatusCode{
63+
Code: resp.StatusCode,
64+
}
6165
}
6266

6367
return nil

xrpl/faucet/errors.go

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,45 @@
11
package faucet
22

3-
import "errors"
3+
import (
4+
"fmt"
5+
)
46

5-
var (
6-
// ErrMarshalPayload is returned when the faucet payload cannot be marshaled to JSON.
7-
ErrMarshalPayload = errors.New("failed to marshal faucet payload")
7+
// ErrMarshalPayload is returned when the faucet payload cannot be marshaled to JSON.
8+
type ErrMarshalPayload struct {
9+
Err error
10+
}
811

9-
// ErrCreateRequest is returned when the faucet request cannot be created.
10-
ErrCreateRequest = errors.New("failed to create faucet request")
12+
// Error implements the error interface for ErrMarshalPayload
13+
func (e ErrMarshalPayload) Error() string {
14+
return fmt.Sprintf("failed to marshal faucet payload: %v", e.Err)
15+
}
1116

12-
// ErrSendRequest is returned when the faucet request cannot be sent.
13-
ErrSendRequest = errors.New("failed to send POST request to faucet")
17+
// ErrCreateRequest is returned when the faucet request cannot be created.
18+
type ErrCreateRequest struct {
19+
Err error
20+
}
1421

15-
// ErrUnexpectedStatusCode is returned when the faucet responds with a non-200 status code.
16-
ErrUnexpectedStatusCode = errors.New("unexpected faucet response status code")
17-
)
22+
// Error implements the error interface for ErrCreateRequest
23+
func (e ErrCreateRequest) Error() string {
24+
return fmt.Sprintf("failed to create faucet request: %v", e.Err)
25+
}
26+
27+
// ErrSendRequest is returned when the faucet request cannot be sent.
28+
type ErrSendRequest struct {
29+
Err error
30+
}
31+
32+
// Error implements the error interface for ErrSendRequest
33+
func (e ErrSendRequest) Error() string {
34+
return fmt.Sprintf("failed to send POST request to faucet: %v", e.Err)
35+
}
36+
37+
// ErrUnexpectedStatusCode is returned when the faucet responds with a non-200 status code.
38+
type ErrUnexpectedStatusCode struct {
39+
Code int
40+
}
41+
42+
// Error implements the error interface for ErrUnexpectedStatusCode
43+
func (e ErrUnexpectedStatusCode) Error() string {
44+
return fmt.Sprintf("unexpected faucet response status code: %d", e.Code)
45+
}

xrpl/faucet/testnet.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,32 @@ func (fp *TestnetFaucetProvider) FundWallet(address types.Address) error {
4040
jsonPayload, err := json.Marshal(payload)
4141

4242
if err != nil {
43-
return fmt.Errorf("%w: %v", ErrMarshalPayload, err)
43+
return ErrMarshalPayload{
44+
Err: err,
45+
}
4446
}
4547

4648
req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(jsonPayload))
4749
if err != nil {
48-
return fmt.Errorf("%w: %v", ErrCreateRequest, err)
50+
return ErrCreateRequest{
51+
Err: err,
52+
}
4953
}
5054
req.Header.Set("Content-Type", "application/json")
5155

5256
resp, err := http.DefaultClient.Do(req)
5357
if err != nil {
54-
return fmt.Errorf("%w: %v", ErrSendRequest, err)
58+
return ErrSendRequest{
59+
Err: err,
60+
}
5561
}
5662
defer func() {
5763
_ = resp.Body.Close()
5864
}()
5965
if resp.StatusCode != http.StatusOK {
60-
return fmt.Errorf("%w: %d", ErrUnexpectedStatusCode, resp.StatusCode)
66+
return ErrUnexpectedStatusCode{
67+
Code: resp.StatusCode,
68+
}
6169
}
6270

6371
return nil

xrpl/ledger-entry-types/errors.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,42 @@ package ledger
22

33
import (
44
"errors"
5+
"fmt"
56
)
67

78
var (
89
// ledger object
910

10-
// ErrUnrecognizedLedgerObjectType is returned when an unrecognized ledger object type is encountered.
11-
ErrUnrecognizedLedgerObjectType = errors.New("unrecognized LedgerObject type")
1211
// ErrUnsupportedLedgerObjectType is returned when an unsupported ledger object type is encountered.
1312
ErrUnsupportedLedgerObjectType = errors.New("unsupported ledger object type")
1413

1514
// oracle
1615

17-
// ErrPriceDataScale is returned when the scale is greater than the maximum allowed.
18-
ErrPriceDataScale = errors.New("invalid price data scale")
1916
// ErrPriceDataAssetPriceAndScale is returned when the asset price and scale are not set together.
2017
ErrPriceDataAssetPriceAndScale = errors.New("asset price and scale must be set together")
2118
// ErrPriceDataBaseAsset is returned when the base asset is required but not set.
2219
ErrPriceDataBaseAsset = errors.New("base asset is required")
2320
// ErrPriceDataQuoteAsset is returned when the quote asset is required but not set.
2421
ErrPriceDataQuoteAsset = errors.New("quote asset is required")
2522
)
23+
24+
// ErrPriceDataScale is returned when the scale is greater than the maximum allowed.
25+
type ErrPriceDataScale struct {
26+
Value uint8
27+
Limit uint8
28+
}
29+
30+
// Error implements the error interface for ErrPriceDataScale
31+
func (e ErrPriceDataScale) Error() string {
32+
return fmt.Sprintf("invalid price data scale: got %d, must be less than %d", e.Value, e.Limit)
33+
}
34+
35+
// ErrUnrecognizedLedgerObjectType is returned when an unrecognized ledger object type is encountered.
36+
type ErrUnrecognizedLedgerObjectType struct {
37+
Type interface{}
38+
}
39+
40+
// Error implements the error interface for ErrUnrecognizedLedgerObjectType
41+
func (e ErrUnrecognizedLedgerObjectType) Error() string {
42+
return fmt.Sprintf("unrecognized Ledger Object type: %v", e.Type)
43+
}

xrpl/ledger-entry-types/ledger_object.go

Lines changed: 2 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package ledger
22

3-
import (
4-
"encoding/json"
5-
"fmt"
6-
)
7-
83
// EntryType represents the type of a ledger entry as a string identifier.
94
type EntryType string
105

@@ -105,77 +100,7 @@ func EmptyLedgerObject(t string) (Object, error) {
105100
case XChainOwnedCreateAccountClaimIDEntry:
106101
return &XChainOwnedCreateAccountClaimID{}, nil
107102
}
108-
return nil, fmt.Errorf("%w: %q", ErrUnrecognizedLedgerObjectType, t)
109-
}
110-
111-
// UnmarshalLedgerObject parses the provided JSON data into the correct ledger entry object based on its LedgerEntryType.
112-
func UnmarshalLedgerObject(data []byte) (Object, error) {
113-
if len(data) == 0 {
114-
return nil, nil
115-
}
116-
type helper struct {
117-
LedgerEntryType EntryType
103+
return nil, ErrUnrecognizedLedgerObjectType{
104+
Type: t,
118105
}
119-
var h helper
120-
if err := json.Unmarshal(data, &h); err != nil {
121-
return nil, err
122-
}
123-
var o Object
124-
switch h.LedgerEntryType {
125-
case AccountRootEntry:
126-
o = &AccountRoot{}
127-
case AmendmentsEntry:
128-
o = &Amendments{}
129-
case BridgeEntry:
130-
o = &Bridge{}
131-
case CheckEntry:
132-
o = &Check{}
133-
case CredentialEntry:
134-
o = &Credential{}
135-
case DelegateEntry:
136-
o = &Delegate{}
137-
case DepositPreauthObjEntry:
138-
o = &DepositPreauthObj{}
139-
case DIDEntry:
140-
o = &DID{}
141-
case DirectoryNodeEntry:
142-
o = &DirectoryNode{}
143-
case EscrowEntry:
144-
o = &Escrow{}
145-
case FeeSettingsEntry:
146-
o = &FeeSettings{}
147-
case LedgerHashesEntry:
148-
o = &Hashes{}
149-
case NegativeUNLEntry:
150-
o = &NegativeUNL{}
151-
case NFTokenOfferEntry:
152-
o = &NFTokenOffer{}
153-
case NFTokenPageEntry:
154-
o = &NFTokenPage{}
155-
case OfferEntry:
156-
o = &Offer{}
157-
case OracleEntry:
158-
o = &Oracle{}
159-
case PayChannelEntry:
160-
o = &PayChannel{}
161-
case PermissionedDomainEntry:
162-
o = &PermissionedDomain{}
163-
case RippleStateEntry:
164-
o = &RippleState{}
165-
case SignerListEntry:
166-
o = &SignerList{}
167-
case TicketEntry:
168-
o = &Ticket{}
169-
case XChainOwnedClaimIDEntry:
170-
o = &XChainOwnedClaimID{}
171-
case XChainOwnedCreateAccountClaimIDEntry:
172-
o = &XChainOwnedCreateAccountClaimID{}
173-
default:
174-
return nil, fmt.Errorf("%w: %s", ErrUnsupportedLedgerObjectType, h.LedgerEntryType)
175-
}
176-
if err := json.Unmarshal(data, o); err != nil {
177-
return nil, err
178-
}
179-
return o, nil
180-
181106
}

0 commit comments

Comments
 (0)