Skip to content

Commit 8fc6f5d

Browse files
authored
Standardized error messages across iso8583 prefixers (#343)
1 parent 9183e0c commit 8fc6f5d

16 files changed

+71
-60
lines changed

describe.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/hex"
55
"fmt"
66
"io"
7+
"strconv"
78
"strings"
89
"text/tabwriter"
910

@@ -36,7 +37,7 @@ func (m *MessageWrapper) GetSubfields() map[string]field.Field {
3637
fields := m.Message.GetFields()
3738
result := make(map[string]field.Field, len(fields))
3839
for k, v := range fields {
39-
result[fmt.Sprintf("%d", k)] = v
40+
result[strconv.Itoa(k)] = v
4041
}
4142
return result
4243
}

field_filter.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package iso8583
22

33
import (
4-
"fmt"
4+
"errors"
55
"unicode/utf8"
66

77
"github.com/moov-io/iso8583/field"
@@ -19,6 +19,8 @@ const (
1919
panPattern = "****"
2020
)
2121

22+
var ErrCreatingNewTrackData = errors.New("creating new track data")
23+
2224
type FilterFunc func(in string, data field.Field) string
2325

2426
type FieldFilter func(fieldFilters map[string]FilterFunc)
@@ -109,7 +111,7 @@ func newTrackData(data, track field.Field) error {
109111
if raw, err := data.Pack(); err == nil {
110112
track.SetSpec(data.Spec())
111113
if _, err := track.Unpack(raw); err != nil {
112-
return fmt.Errorf("creating new track data")
114+
return ErrCreatingNewTrackData
113115
}
114116
}
115117

message.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ func (m *Message) MarshalJSON() ([]byte, error) {
318318
fieldMap := m.getFields()
319319
strFieldMap := map[string]field.Field{}
320320
for id, field := range fieldMap {
321-
strFieldMap[fmt.Sprint(id)] = field
321+
strFieldMap[strconv.Itoa(id)] = field
322322
}
323323

324324
// get only fields that were set

message_spec_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ func TestMessageSpec_CreateMessageFields(t *testing.T) {
3030
fields := spec.CreateMessageFields()
3131

3232
// test that derived fields have the same type as in the message spec
33-
require.True(t, reflect.TypeOf(fields[0]).Elem() == reflect.TypeOf(field.String{}))
34-
require.True(t, reflect.TypeOf(fields[1]).Elem() == reflect.TypeOf(field.Bitmap{}))
33+
require.Equal(t, reflect.TypeOf(field.String{}), reflect.TypeOf(fields[0]).Elem())
34+
require.Equal(t, reflect.TypeOf(field.Bitmap{}), reflect.TypeOf(fields[1]).Elem())
3535

3636
// test that derived field have the same spec
3737
require.Equal(t, fields[0].Spec(), spec.Fields[0].Spec())

message_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,7 @@ func TestPackUnpack(t *testing.T) {
903903
require.Error(t, err)
904904
var unpackError *iso8583errors.UnpackError
905905
require.ErrorAs(t, err, &unpackError)
906-
assert.Equal(t, unpackError.FieldID, "120")
906+
assert.Equal(t, "120", unpackError.FieldID)
907907

908908
s, err := message.GetString(2)
909909
require.NoError(t, err)

prefix/ascii.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ var ASCII = Prefixers{
2222

2323
func (p *asciiVarPrefixer) EncodeLength(maxLen, dataLen int) ([]byte, error) {
2424
if dataLen > maxLen {
25-
return nil, fmt.Errorf("field length: %d is larger than maximum: %d", dataLen, maxLen)
25+
return nil, fmt.Errorf(fieldLengthIsLargerThanMax, dataLen, maxLen)
2626
}
2727

2828
if len(strconv.Itoa(dataLen)) > p.Digits {
29-
return nil, fmt.Errorf("number of digits in length: %d exceeds: %d", dataLen, p.Digits)
29+
return nil, fmt.Errorf(numberOfDigitsInLengthExceeds, dataLen, p.Digits)
3030
}
3131

3232
res := fmt.Sprintf("%0*d", p.Digits, dataLen)
@@ -36,7 +36,7 @@ func (p *asciiVarPrefixer) EncodeLength(maxLen, dataLen int) ([]byte, error) {
3636

3737
func (p *asciiVarPrefixer) DecodeLength(maxLen int, data []byte) (int, int, error) {
3838
if len(data) < p.Digits {
39-
return 0, 0, fmt.Errorf("not enough data length: %d to read: %d byte digits", len(data), p.Digits)
39+
return 0, 0, fmt.Errorf(notEnoughDataToRead, len(data), p.Digits)
4040
}
4141

4242
dataLen, err := strconv.Atoi(string(data[:p.Digits]))
@@ -46,11 +46,11 @@ func (p *asciiVarPrefixer) DecodeLength(maxLen int, data []byte) (int, int, erro
4646

4747
// length should be positive
4848
if dataLen < 0 {
49-
return 0, 0, fmt.Errorf("invalid length: %d", dataLen)
49+
return 0, 0, fmt.Errorf(invalidLength, dataLen)
5050
}
5151

5252
if dataLen > maxLen {
53-
return 0, 0, fmt.Errorf("data length: %d is larger than maximum %d", dataLen, maxLen)
53+
return 0, 0, fmt.Errorf(dataLengthIsLargerThanMax, dataLen, maxLen)
5454
}
5555

5656
return dataLen, p.Digits, nil
@@ -65,7 +65,7 @@ type asciiFixedPrefixer struct {
6565

6666
func (p *asciiFixedPrefixer) EncodeLength(fixLen, dataLen int) ([]byte, error) {
6767
if dataLen != fixLen {
68-
return nil, fmt.Errorf("field length: %d should be fixed: %d", dataLen, fixLen)
68+
return nil, fmt.Errorf(fieldLengthShouldBeFixed, dataLen, fixLen)
6969
}
7070

7171
return []byte{}, nil

prefix/bcd.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ var BCD = Prefixers{
2525

2626
func (p *bcdVarPrefixer) EncodeLength(maxLen, dataLen int) ([]byte, error) {
2727
if dataLen > maxLen {
28-
return nil, fmt.Errorf("field length: %d is larger than maximum: %d", dataLen, maxLen)
28+
return nil, fmt.Errorf(fieldLengthIsLargerThanMax, dataLen, maxLen)
2929
}
3030

3131
if len(strconv.Itoa(dataLen)) > p.Digits {
32-
return nil, fmt.Errorf("number of digits in length: %d exceeds: %d", dataLen, p.Digits)
32+
return nil, fmt.Errorf(numberOfDigitsInLengthExceeds, dataLen, p.Digits)
3333
}
3434

3535
strLen := fmt.Sprintf("%0*d", p.Digits, dataLen)
@@ -44,7 +44,7 @@ func (p *bcdVarPrefixer) EncodeLength(maxLen, dataLen int) ([]byte, error) {
4444
func (p *bcdVarPrefixer) DecodeLength(maxLen int, data []byte) (int, int, error) {
4545
length := bcd.EncodedLen(p.Digits)
4646
if len(data) < length {
47-
return 0, 0, fmt.Errorf("length mismatch: want to read %d bytes, get only %d", length, len(data))
47+
return 0, 0, fmt.Errorf(notEnoughDataToRead, length, len(data))
4848
}
4949

5050
bDigits, _, err := encoding.BCD.Decode(data[:length], p.Digits)
@@ -58,7 +58,7 @@ func (p *bcdVarPrefixer) DecodeLength(maxLen int, data []byte) (int, int, error)
5858
}
5959

6060
if dataLen > maxLen {
61-
return 0, 0, fmt.Errorf("data length %d is larger than maximum %d", dataLen, maxLen)
61+
return 0, 0, fmt.Errorf(dataLengthIsLargerThanMax, dataLen, maxLen)
6262
}
6363

6464
return dataLen, length, nil
@@ -73,7 +73,7 @@ type bcdFixedPrefixer struct {
7373

7474
func (p *bcdFixedPrefixer) EncodeLength(fixLen, dataLen int) ([]byte, error) {
7575
if dataLen != fixLen {
76-
return nil, fmt.Errorf("field length: %d should be fixed: %d", dataLen, fixLen)
76+
return nil, fmt.Errorf(fieldLengthShouldBeFixed, dataLen, fixLen)
7777
}
7878

7979
return []byte{}, nil

prefix/bcd_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func TestBCDVarPrefixer_EncodeLengthMaxLengthValidation(t *testing.T) {
2121
func TestBCDVarPrefixer_DecodeLengthMaxLengthValidation(t *testing.T) {
2222
_, _, err := BCD.LLL.DecodeLength(20, []byte{0x22})
2323

24-
require.Contains(t, err.Error(), "length mismatch: want to read 2 bytes, get only 1")
24+
require.Contains(t, err.Error(), "not enough data length: 2 to read: 1 byte digits")
2525
}
2626

2727
func TestBCDVarPrefixer_LHelpers(t *testing.T) {

prefix/bertlv.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func (p *berTLVPrefixer) EncodeLength(maxLen, dataLen int) ([]byte, error) {
3636
// checking maxLen for a 0 is a way to disable check and also support
3737
// backwards compatibility with the old contract that didn't have maxLen
3838
if maxLen != 0 && dataLen > maxLen {
39-
return nil, fmt.Errorf("field length: %d is larger than maximum: %d", dataLen, maxLen)
39+
return nil, fmt.Errorf(fieldLengthIsLargerThanMax, dataLen, maxLen)
4040
}
4141

4242
buf := big.NewInt(int64(dataLen)).Bytes()
@@ -67,7 +67,7 @@ func (p *berTLVPrefixer) DecodeLength(maxLen int, data []byte) (int, int, error)
6767
// checking maxLen for a 0 is a way to disable check and also support
6868
// backwards compatibility with the old contract that didn't have maxLen
6969
if maxLen != 0 && dataLen > maxLen {
70-
return 0, read, fmt.Errorf("field length: %d is larger than maximum: %d", dataLen, maxLen)
70+
return 0, read, fmt.Errorf(fieldLengthIsLargerThanMax, dataLen, maxLen)
7171
}
7272

7373
return dataLen, read, nil
@@ -85,7 +85,7 @@ func (p *berTLVPrefixer) DecodeLength(maxLen int, data []byte) (int, int, error)
8585
// checking maxLen for a 0 is a way to disable check and also support
8686
// backwards compatibility with the old contract that didn't have maxLen
8787
if maxLen != 0 && dataLen > maxLen {
88-
return 0, read, fmt.Errorf("field length: %d is larger than maximum: %d", dataLen, maxLen)
88+
return 0, read, fmt.Errorf(fieldLengthIsLargerThanMax, dataLen, maxLen)
8989
}
9090

9191
return dataLen, read, nil

prefix/binary.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type binaryFixedPrefixer struct {
2222

2323
func (p *binaryFixedPrefixer) EncodeLength(fixLen, dataLen int) ([]byte, error) {
2424
if dataLen != fixLen {
25-
return nil, fmt.Errorf("field length: %d should be fixed: %d", dataLen, fixLen)
25+
return nil, fmt.Errorf(fieldLengthShouldBeFixed, dataLen, fixLen)
2626
}
2727

2828
return []byte{}, nil
@@ -64,7 +64,7 @@ func bytesToInt(b []byte) (int, error) {
6464

6565
func (p *binaryVarPrefixer) EncodeLength(maxLen, dataLen int) ([]byte, error) {
6666
if dataLen > maxLen {
67-
return nil, fmt.Errorf("field length: %d is larger than maximum: %d", dataLen, maxLen)
67+
return nil, fmt.Errorf(fieldLengthIsLargerThanMax, dataLen, maxLen)
6868
}
6969

7070
res, err := intToBytes(dataLen)
@@ -76,7 +76,7 @@ func (p *binaryVarPrefixer) EncodeLength(maxLen, dataLen int) ([]byte, error) {
7676
res = bytes.TrimLeft(res, "\x00")
7777

7878
if len(res) > p.Digits {
79-
return nil, fmt.Errorf("number of digits in length: %d exceeds: %d", dataLen, p.Digits)
79+
return nil, fmt.Errorf(numberOfDigitsInLengthExceeds, dataLen, p.Digits)
8080
}
8181

8282
// if len of res is less than p.Digits prepend with 0x00
@@ -92,7 +92,7 @@ func (p *binaryVarPrefixer) EncodeLength(maxLen, dataLen int) ([]byte, error) {
9292
// and the number of bytes read.
9393
func (p *binaryVarPrefixer) DecodeLength(maxLen int, data []byte) (int, int, error) {
9494
if len(data) < p.Digits {
95-
return 0, 0, fmt.Errorf("not enough data length: %d to read: %d bytes", len(data), p.Digits)
95+
return 0, 0, fmt.Errorf(notEnoughDataToRead, len(data), p.Digits)
9696
}
9797

9898
prefBytes := data[:p.Digits]
@@ -111,7 +111,7 @@ func (p *binaryVarPrefixer) DecodeLength(maxLen int, data []byte) (int, int, err
111111
}
112112

113113
if dataLen > maxLen {
114-
return 0, 0, fmt.Errorf("data length: %d is larger than maximum %d", dataLen, maxLen)
114+
return 0, 0, fmt.Errorf(dataLengthIsLargerThanMax, dataLen, maxLen)
115115
}
116116

117117
return dataLen, p.Digits, nil

0 commit comments

Comments
 (0)