@@ -17,52 +17,6 @@ type Decoder struct {
17
17
nextOffset uint
18
18
}
19
19
20
- func (d * Decoder ) reset (offset uint ) {
21
- d .offset = offset
22
- d .hasNextOffset = false
23
- d .nextOffset = 0
24
- }
25
-
26
- func (d * Decoder ) setNextOffset (offset uint ) {
27
- if ! d .hasNextOffset {
28
- d .hasNextOffset = true
29
- d .nextOffset = offset
30
- }
31
- }
32
-
33
- func unexpectedTypeErr (expectedType , actualType Type ) error {
34
- return fmt .Errorf ("unexpected type %d, expected %d" , actualType , expectedType )
35
- }
36
-
37
- func (d * Decoder ) decodeCtrlDataAndFollow (expectedType Type ) (uint , uint , error ) {
38
- dataOffset := d .offset
39
- for {
40
- var typeNum Type
41
- var size uint
42
- var err error
43
- typeNum , size , dataOffset , err = d .d .decodeCtrlData (dataOffset )
44
- if err != nil {
45
- return 0 , 0 , err
46
- }
47
-
48
- if typeNum == TypePointer {
49
- var nextOffset uint
50
- dataOffset , nextOffset , err = d .d .decodePointer (size , dataOffset )
51
- if err != nil {
52
- return 0 , 0 , err
53
- }
54
- d .setNextOffset (nextOffset )
55
- continue
56
- }
57
-
58
- if typeNum != expectedType {
59
- return 0 , 0 , unexpectedTypeErr (expectedType , typeNum )
60
- }
61
-
62
- return size , dataOffset , nil
63
- }
64
- }
65
-
66
20
// DecodeBool decodes the value pointed by the decoder as a bool.
67
21
//
68
22
// Returns an error if the database is malformed or if the pointed value is not a bool.
@@ -85,15 +39,6 @@ func (d *Decoder) DecodeBool() (bool, error) {
85
39
return value , nil
86
40
}
87
41
88
- func (d * Decoder ) decodeBytes (typ Type ) ([]byte , error ) {
89
- size , offset , err := d .decodeCtrlDataAndFollow (typ )
90
- if err != nil {
91
- return nil , err
92
- }
93
- d .setNextOffset (offset + size )
94
- return d .d .buffer [offset : offset + size ], nil
95
- }
96
-
97
42
// DecodeString decodes the value pointed by the decoder as a string.
98
43
//
99
44
// Returns an error if the database is malformed or if the pointed value is not a string.
@@ -382,3 +327,71 @@ func (d *Decoder) DecodeSlice() iter.Seq[error] {
382
327
d .reset (currentOffset )
383
328
}
384
329
}
330
+
331
+ // SkipValue skips over the current value without decoding it.
332
+ // This is useful in custom decoders when encountering unknown fields.
333
+ // The decoder will be positioned after the skipped value.
334
+ func (d * Decoder ) SkipValue () error {
335
+ // We can reuse the existing nextValueOffset logic by jumping to the next value
336
+ nextOffset , err := d .d .nextValueOffset (d .offset , 1 )
337
+ if err != nil {
338
+ return err
339
+ }
340
+ d .reset (nextOffset )
341
+ return nil
342
+ }
343
+
344
+ func (d * Decoder ) reset (offset uint ) {
345
+ d .offset = offset
346
+ d .hasNextOffset = false
347
+ d .nextOffset = 0
348
+ }
349
+
350
+ func (d * Decoder ) setNextOffset (offset uint ) {
351
+ if ! d .hasNextOffset {
352
+ d .hasNextOffset = true
353
+ d .nextOffset = offset
354
+ }
355
+ }
356
+
357
+ func unexpectedTypeErr (expectedType , actualType Type ) error {
358
+ return fmt .Errorf ("unexpected type %d, expected %d" , actualType , expectedType )
359
+ }
360
+
361
+ func (d * Decoder ) decodeCtrlDataAndFollow (expectedType Type ) (uint , uint , error ) {
362
+ dataOffset := d .offset
363
+ for {
364
+ var typeNum Type
365
+ var size uint
366
+ var err error
367
+ typeNum , size , dataOffset , err = d .d .decodeCtrlData (dataOffset )
368
+ if err != nil {
369
+ return 0 , 0 , err
370
+ }
371
+
372
+ if typeNum == TypePointer {
373
+ var nextOffset uint
374
+ dataOffset , nextOffset , err = d .d .decodePointer (size , dataOffset )
375
+ if err != nil {
376
+ return 0 , 0 , err
377
+ }
378
+ d .setNextOffset (nextOffset )
379
+ continue
380
+ }
381
+
382
+ if typeNum != expectedType {
383
+ return 0 , 0 , unexpectedTypeErr (expectedType , typeNum )
384
+ }
385
+
386
+ return size , dataOffset , nil
387
+ }
388
+ }
389
+
390
+ func (d * Decoder ) decodeBytes (typ Type ) ([]byte , error ) {
391
+ size , offset , err := d .decodeCtrlDataAndFollow (typ )
392
+ if err != nil {
393
+ return nil , err
394
+ }
395
+ d .setNextOffset (offset + size )
396
+ return d .d .buffer [offset : offset + size ], nil
397
+ }
0 commit comments