@@ -33,7 +33,14 @@ func NewDecoder(d DataDecoder, offset uint, options ...DecoderOption) *Decoder {
33
33
for _ , option := range options {
34
34
option (& opts )
35
35
}
36
- return & Decoder {d : d , offset : offset , opts : opts }
36
+
37
+ decoder := & Decoder {
38
+ d : d ,
39
+ offset : offset ,
40
+ opts : opts ,
41
+ }
42
+
43
+ return decoder
37
44
}
38
45
39
46
// ReadBool reads the value pointed by the decoder as a bool.
@@ -42,14 +49,14 @@ func NewDecoder(d DataDecoder, offset uint, options ...DecoderOption) *Decoder {
42
49
func (d * Decoder ) ReadBool () (bool , error ) {
43
50
size , offset , err := d .decodeCtrlDataAndFollow (KindBool )
44
51
if err != nil {
45
- return false , err
52
+ return false , d . wrapError ( err )
46
53
}
47
54
48
55
if size > 1 {
49
- return false , mmdberrors .NewInvalidDatabaseError (
56
+ return false , d . wrapError ( mmdberrors .NewInvalidDatabaseError (
50
57
"the MaxMind DB file's data section contains bad data (bool size of %v)" ,
51
58
size ,
52
- )
59
+ ))
53
60
}
54
61
55
62
var value bool
@@ -64,16 +71,20 @@ func (d *Decoder) ReadBool() (bool, error) {
64
71
func (d * Decoder ) ReadString () (string , error ) {
65
72
val , err := d .readBytes (KindString )
66
73
if err != nil {
67
- return "" , err
74
+ return "" , d . wrapError ( err )
68
75
}
69
- return string (val ), err
76
+ return string (val ), nil
70
77
}
71
78
72
79
// ReadBytes reads the value pointed by the decoder as bytes.
73
80
//
74
81
// Returns an error if the database is malformed or if the pointed value is not bytes.
75
82
func (d * Decoder ) ReadBytes () ([]byte , error ) {
76
- return d .readBytes (KindBytes )
83
+ val , err := d .readBytes (KindBytes )
84
+ if err != nil {
85
+ return nil , d .wrapError (err )
86
+ }
87
+ return val , nil
77
88
}
78
89
79
90
// ReadFloat32 reads the value pointed by the decoder as a float32.
@@ -82,19 +93,19 @@ func (d *Decoder) ReadBytes() ([]byte, error) {
82
93
func (d * Decoder ) ReadFloat32 () (float32 , error ) {
83
94
size , offset , err := d .decodeCtrlDataAndFollow (KindFloat32 )
84
95
if err != nil {
85
- return 0 , err
96
+ return 0 , d . wrapError ( err )
86
97
}
87
98
88
99
if size != 4 {
89
- return 0 , mmdberrors .NewInvalidDatabaseError (
100
+ return 0 , d . wrapError ( mmdberrors .NewInvalidDatabaseError (
90
101
"the MaxMind DB file's data section contains bad data (float32 size of %v)" ,
91
102
size ,
92
- )
103
+ ))
93
104
}
94
105
95
106
value , nextOffset , err := d .d .DecodeFloat32 (size , offset )
96
107
if err != nil {
97
- return 0 , err
108
+ return 0 , d . wrapError ( err )
98
109
}
99
110
100
111
d .setNextOffset (nextOffset )
@@ -107,19 +118,19 @@ func (d *Decoder) ReadFloat32() (float32, error) {
107
118
func (d * Decoder ) ReadFloat64 () (float64 , error ) {
108
119
size , offset , err := d .decodeCtrlDataAndFollow (KindFloat64 )
109
120
if err != nil {
110
- return 0 , err
121
+ return 0 , d . wrapError ( err )
111
122
}
112
123
113
124
if size != 8 {
114
- return 0 , mmdberrors .NewInvalidDatabaseError (
125
+ return 0 , d . wrapError ( mmdberrors .NewInvalidDatabaseError (
115
126
"the MaxMind DB file's data section contains bad data (float64 size of %v)" ,
116
127
size ,
117
- )
128
+ ))
118
129
}
119
130
120
131
value , nextOffset , err := d .d .DecodeFloat64 (size , offset )
121
132
if err != nil {
122
- return 0 , err
133
+ return 0 , d . wrapError ( err )
123
134
}
124
135
125
136
d .setNextOffset (nextOffset )
@@ -132,19 +143,19 @@ func (d *Decoder) ReadFloat64() (float64, error) {
132
143
func (d * Decoder ) ReadInt32 () (int32 , error ) {
133
144
size , offset , err := d .decodeCtrlDataAndFollow (KindInt32 )
134
145
if err != nil {
135
- return 0 , err
146
+ return 0 , d . wrapError ( err )
136
147
}
137
148
138
149
if size > 4 {
139
- return 0 , mmdberrors .NewInvalidDatabaseError (
150
+ return 0 , d . wrapError ( mmdberrors .NewInvalidDatabaseError (
140
151
"the MaxMind DB file's data section contains bad data (int32 size of %v)" ,
141
152
size ,
142
- )
153
+ ))
143
154
}
144
155
145
156
value , nextOffset , err := d .d .DecodeInt32 (size , offset )
146
157
if err != nil {
147
- return 0 , err
158
+ return 0 , d . wrapError ( err )
148
159
}
149
160
150
161
d .setNextOffset (nextOffset )
@@ -158,19 +169,19 @@ func (d *Decoder) ReadInt32() (int32, error) {
158
169
func (d * Decoder ) ReadUInt16 () (uint16 , error ) {
159
170
size , offset , err := d .decodeCtrlDataAndFollow (KindUint16 )
160
171
if err != nil {
161
- return 0 , err
172
+ return 0 , d . wrapError ( err )
162
173
}
163
174
164
175
if size > 2 {
165
- return 0 , mmdberrors .NewInvalidDatabaseError (
176
+ return 0 , d . wrapError ( mmdberrors .NewInvalidDatabaseError (
166
177
"the MaxMind DB file's data section contains bad data (uint16 size of %v)" ,
167
178
size ,
168
- )
179
+ ))
169
180
}
170
181
171
182
value , nextOffset , err := d .d .DecodeUint16 (size , offset )
172
183
if err != nil {
173
- return 0 , err
184
+ return 0 , d . wrapError ( err )
174
185
}
175
186
176
187
d .setNextOffset (nextOffset )
@@ -183,19 +194,19 @@ func (d *Decoder) ReadUInt16() (uint16, error) {
183
194
func (d * Decoder ) ReadUInt32 () (uint32 , error ) {
184
195
size , offset , err := d .decodeCtrlDataAndFollow (KindUint32 )
185
196
if err != nil {
186
- return 0 , err
197
+ return 0 , d . wrapError ( err )
187
198
}
188
199
189
200
if size > 4 {
190
- return 0 , mmdberrors .NewInvalidDatabaseError (
201
+ return 0 , d . wrapError ( mmdberrors .NewInvalidDatabaseError (
191
202
"the MaxMind DB file's data section contains bad data (uint32 size of %v)" ,
192
203
size ,
193
- )
204
+ ))
194
205
}
195
206
196
207
value , nextOffset , err := d .d .DecodeUint32 (size , offset )
197
208
if err != nil {
198
- return 0 , err
209
+ return 0 , d . wrapError ( err )
199
210
}
200
211
201
212
d .setNextOffset (nextOffset )
@@ -208,19 +219,19 @@ func (d *Decoder) ReadUInt32() (uint32, error) {
208
219
func (d * Decoder ) ReadUInt64 () (uint64 , error ) {
209
220
size , offset , err := d .decodeCtrlDataAndFollow (KindUint64 )
210
221
if err != nil {
211
- return 0 , err
222
+ return 0 , d . wrapError ( err )
212
223
}
213
224
214
225
if size > 8 {
215
- return 0 , mmdberrors .NewInvalidDatabaseError (
226
+ return 0 , d . wrapError ( mmdberrors .NewInvalidDatabaseError (
216
227
"the MaxMind DB file's data section contains bad data (uint64 size of %v)" ,
217
228
size ,
218
- )
229
+ ))
219
230
}
220
231
221
232
value , nextOffset , err := d .d .DecodeUint64 (size , offset )
222
233
if err != nil {
223
- return 0 , err
234
+ return 0 , d . wrapError ( err )
224
235
}
225
236
226
237
d .setNextOffset (nextOffset )
@@ -233,22 +244,22 @@ func (d *Decoder) ReadUInt64() (uint64, error) {
233
244
func (d * Decoder ) ReadUInt128 () (hi , lo uint64 , err error ) {
234
245
size , offset , err := d .decodeCtrlDataAndFollow (KindUint128 )
235
246
if err != nil {
236
- return 0 , 0 , err
247
+ return 0 , 0 , d . wrapError ( err )
237
248
}
238
249
239
250
if size > 16 {
240
- return 0 , 0 , mmdberrors .NewInvalidDatabaseError (
251
+ return 0 , 0 , d . wrapError ( mmdberrors .NewInvalidDatabaseError (
241
252
"the MaxMind DB file's data section contains bad data (uint128 size of %v)" ,
242
253
size ,
243
- )
254
+ ))
244
255
}
245
256
246
257
if offset + size > uint (len (d .d .Buffer ())) {
247
- return 0 , 0 , mmdberrors .NewInvalidDatabaseError (
258
+ return 0 , 0 , d . wrapError ( mmdberrors .NewInvalidDatabaseError (
248
259
"the MaxMind DB file's data section contains bad data (offset+size %d exceeds buffer length %d)" ,
249
260
offset + size ,
250
261
len (d .d .Buffer ()),
251
- )
262
+ ))
252
263
}
253
264
254
265
for _ , b := range d .d .Buffer ()[offset : offset + size ] {
@@ -276,7 +287,7 @@ func (d *Decoder) ReadMap() iter.Seq2[[]byte, error] {
276
287
return func (yield func ([]byte , error ) bool ) {
277
288
size , offset , err := d .decodeCtrlDataAndFollow (KindMap )
278
289
if err != nil {
279
- yield (nil , err )
290
+ yield (nil , d . wrapError ( err ) )
280
291
return
281
292
}
282
293
@@ -285,7 +296,7 @@ func (d *Decoder) ReadMap() iter.Seq2[[]byte, error] {
285
296
for range size {
286
297
key , keyEndOffset , err := d .d .DecodeKey (currentOffset )
287
298
if err != nil {
288
- yield (nil , err )
299
+ yield (nil , d . wrapErrorAtOffset ( err , currentOffset ) )
289
300
return
290
301
}
291
302
@@ -300,7 +311,7 @@ func (d *Decoder) ReadMap() iter.Seq2[[]byte, error] {
300
311
// Skip the value to get to next key-value pair
301
312
valueEndOffset , err := d .d .NextValueOffset (keyEndOffset , 1 )
302
313
if err != nil {
303
- yield (nil , err )
314
+ yield (nil , d . wrapError ( err ) )
304
315
return
305
316
}
306
317
currentOffset = valueEndOffset
@@ -318,7 +329,7 @@ func (d *Decoder) ReadSlice() iter.Seq[error] {
318
329
return func (yield func (error ) bool ) {
319
330
size , offset , err := d .decodeCtrlDataAndFollow (KindSlice )
320
331
if err != nil {
321
- yield (err )
332
+ yield (d . wrapError ( err ) )
322
333
return
323
334
}
324
335
@@ -344,7 +355,7 @@ func (d *Decoder) ReadSlice() iter.Seq[error] {
344
355
// Advance to next element
345
356
nextOffset , err := d .d .NextValueOffset (currentOffset , 1 )
346
357
if err != nil {
347
- yield (err )
358
+ yield (d . wrapError ( err ) )
348
359
return
349
360
}
350
361
currentOffset = nextOffset
@@ -362,7 +373,7 @@ func (d *Decoder) SkipValue() error {
362
373
// We can reuse the existing nextValueOffset logic by jumping to the next value
363
374
nextOffset , err := d .d .NextValueOffset (d .offset , 1 )
364
375
if err != nil {
365
- return err
376
+ return d . wrapError ( err )
366
377
}
367
378
d .reset (nextOffset )
368
379
return nil
@@ -373,7 +384,7 @@ func (d *Decoder) SkipValue() error {
373
384
func (d * Decoder ) PeekKind () (Kind , error ) {
374
385
kindNum , _ , _ , err := d .d .DecodeCtrlData (d .offset )
375
386
if err != nil {
376
- return 0 , err
387
+ return 0 , d . wrapError ( err )
377
388
}
378
389
379
390
// Follow pointers to get the actual kind
@@ -384,14 +395,14 @@ func (d *Decoder) PeekKind() (Kind, error) {
384
395
var size uint
385
396
kindNum , size , dataOffset , err = d .d .DecodeCtrlData (dataOffset )
386
397
if err != nil {
387
- return 0 , err
398
+ return 0 , d . wrapError ( err )
388
399
}
389
400
if kindNum != KindPointer {
390
401
break
391
402
}
392
403
dataOffset , _ , err = d .d .DecodePointer (size , dataOffset )
393
404
if err != nil {
394
- return 0 , err
405
+ return 0 , d . wrapError ( err )
395
406
}
396
407
}
397
408
}
@@ -431,14 +442,14 @@ func (d *Decoder) decodeCtrlDataAndFollow(expectedKind Kind) (uint, uint, error)
431
442
var err error
432
443
kindNum , size , dataOffset , err = d .d .DecodeCtrlData (dataOffset )
433
444
if err != nil {
434
- return 0 , 0 , err
445
+ return 0 , 0 , err // Don't wrap here, let caller wrap
435
446
}
436
447
437
448
if kindNum == KindPointer {
438
449
var nextOffset uint
439
450
dataOffset , nextOffset , err = d .d .DecodePointer (size , dataOffset )
440
451
if err != nil {
441
- return 0 , 0 , err
452
+ return 0 , 0 , err // Don't wrap here, let caller wrap
442
453
}
443
454
d .setNextOffset (nextOffset )
444
455
continue
@@ -455,7 +466,7 @@ func (d *Decoder) decodeCtrlDataAndFollow(expectedKind Kind) (uint, uint, error)
455
466
func (d * Decoder ) readBytes (kind Kind ) ([]byte , error ) {
456
467
size , offset , err := d .decodeCtrlDataAndFollow (kind )
457
468
if err != nil {
458
- return nil , err
469
+ return nil , err // Return unwrapped - caller will wrap
459
470
}
460
471
461
472
if offset + size > uint (len (d .d .Buffer ())) {
0 commit comments