Skip to content

Commit bee2d4a

Browse files
committed
Improve naming of data types and make them public
1 parent 2301712 commit bee2d4a

File tree

2 files changed

+85
-64
lines changed

2 files changed

+85
-64
lines changed

internal/decoder/decoder.go

Lines changed: 66 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,48 @@ type DataDecoder struct {
1414
buffer []byte
1515
}
1616

17-
type dataType int
17+
// Type corresponds to the data types defined in the MaxMind DB format
18+
// specification v2.0, specifically in the "Output Data Section".
19+
type Type int
1820

1921
const (
20-
_Extended dataType = iota
21-
_Pointer
22-
_String
23-
_Float64
24-
_Bytes
25-
_Uint16
26-
_Uint32
27-
_Map
28-
_Int32
29-
_Uint64
30-
_Uint128
31-
_Slice
32-
// We don't use the next two. They are placeholders. See the spec
33-
// for more details.
34-
_Container //nolint:deadcode,varcheck // above
35-
_Marker //nolint:deadcode,varcheck // above
36-
_Bool
37-
_Float32
22+
// TypeExtended is an "extended" type. This means that the type is encoded in the
23+
// next byte(s). It should not be used directly.
24+
TypeExtended Type = iota
25+
// TypePointer represents a pointer to another location in the data section.
26+
TypePointer
27+
// TypeString represents a UTF-8 string.
28+
TypeString
29+
// TypeFloat64 represents a 64-bit floating point number (double).
30+
TypeFloat64
31+
// TypeBytes represents a slice of bytes.
32+
TypeBytes
33+
// TypeUint16 represents a 16-bit unsigned integer.
34+
TypeUint16
35+
// TypeUint32 represents a 32-bit unsigned integer.
36+
TypeUint32
37+
// TypeMap represents a map data type. The keys must be strings.
38+
// The values may be any data type.
39+
TypeMap
40+
// TypeInt32 represents a 32-bit signed integer.
41+
TypeInt32
42+
// TypeUint64 represents a 64-bit unsigned integer.
43+
TypeUint64
44+
// TypeUint128 represents a 128-bit unsigned integer.
45+
TypeUint128
46+
// TypeSlice represents an array data type.
47+
TypeSlice
48+
// TypeContainer represents a data cache container. This is used for
49+
// internal database optimization and is not directly used.
50+
// It is included here as a placeholder per the specification.
51+
TypeContainer
52+
// TypeMarker represents an end marker for the data section. It is included
53+
// here as a placeholder per the specification. It is not used directly.
54+
TypeMarker
55+
// TypeBool represents a boolean type.
56+
TypeBool
57+
// TypeFloat32 represents a 32-bit floating point number (float).
58+
TypeFloat32
3859
)
3960

4061
const (
@@ -77,19 +98,19 @@ func (d *DataDecoder) decodeToDeserializer(
7798
return d.decodeFromTypeToDeserializer(typeNum, size, newOffset, dser, depth+1)
7899
}
79100

80-
func (d *DataDecoder) decodeCtrlData(offset uint) (dataType, uint, uint, error) {
101+
func (d *DataDecoder) decodeCtrlData(offset uint) (Type, uint, uint, error) {
81102
newOffset := offset + 1
82103
if offset >= uint(len(d.buffer)) {
83104
return 0, 0, 0, mmdberrors.NewOffsetError()
84105
}
85106
ctrlByte := d.buffer[offset]
86107

87-
typeNum := dataType(ctrlByte >> 5)
88-
if typeNum == _Extended {
108+
typeNum := Type(ctrlByte >> 5)
109+
if typeNum == TypeExtended {
89110
if newOffset >= uint(len(d.buffer)) {
90111
return 0, 0, 0, mmdberrors.NewOffsetError()
91112
}
92-
typeNum = dataType(d.buffer[newOffset] + 7)
113+
typeNum = Type(d.buffer[newOffset] + 7)
93114
newOffset++
94115
}
95116

@@ -101,10 +122,10 @@ func (d *DataDecoder) decodeCtrlData(offset uint) (dataType, uint, uint, error)
101122
func (d *DataDecoder) sizeFromCtrlByte(
102123
ctrlByte byte,
103124
offset uint,
104-
typeNum dataType,
125+
typeNum Type,
105126
) (uint, uint, error) {
106127
size := uint(ctrlByte & 0x1f)
107-
if typeNum == _Extended {
128+
if typeNum == TypeExtended {
108129
return size, offset, nil
109130
}
110131

@@ -134,83 +155,83 @@ func (d *DataDecoder) sizeFromCtrlByte(
134155
}
135156

136157
func (d *DataDecoder) decodeFromTypeToDeserializer(
137-
dtype dataType,
158+
dtype Type,
138159
size uint,
139160
offset uint,
140161
dser deserializer,
141162
depth int,
142163
) (uint, error) {
143164
// For these types, size has a special meaning
144165
switch dtype {
145-
case _Bool:
166+
case TypeBool:
146167
v, offset := decodeBool(size, offset)
147168
return offset, dser.Bool(v)
148-
case _Map:
169+
case TypeMap:
149170
return d.decodeMapToDeserializer(size, offset, dser, depth)
150-
case _Pointer:
171+
case TypePointer:
151172
pointer, newOffset, err := d.decodePointer(size, offset)
152173
if err != nil {
153174
return 0, err
154175
}
155176
_, err = d.decodeToDeserializer(pointer, dser, depth, false)
156177
return newOffset, err
157-
case _Slice:
178+
case TypeSlice:
158179
return d.decodeSliceToDeserializer(size, offset, dser, depth)
159-
case _Bytes:
180+
case TypeBytes:
160181
v, offset, err := d.decodeBytes(size, offset)
161182
if err != nil {
162183
return 0, err
163184
}
164185
return offset, dser.Bytes(v)
165-
case _Float32:
186+
case TypeFloat32:
166187
v, offset, err := d.decodeFloat32(size, offset)
167188
if err != nil {
168189
return 0, err
169190
}
170191
return offset, dser.Float32(v)
171-
case _Float64:
192+
case TypeFloat64:
172193
v, offset, err := d.decodeFloat64(size, offset)
173194
if err != nil {
174195
return 0, err
175196
}
176197

177198
return offset, dser.Float64(v)
178-
case _Int32:
199+
case TypeInt32:
179200
v, offset, err := d.decodeInt(size, offset)
180201
if err != nil {
181202
return 0, err
182203
}
183204

184205
return offset, dser.Int32(int32(v))
185-
case _String:
206+
case TypeString:
186207
v, offset, err := d.decodeString(size, offset)
187208
if err != nil {
188209
return 0, err
189210
}
190211

191212
return offset, dser.String(v)
192-
case _Uint16:
213+
case TypeUint16:
193214
v, offset, err := d.decodeUint(size, offset)
194215
if err != nil {
195216
return 0, err
196217
}
197218

198219
return offset, dser.Uint16(uint16(v))
199-
case _Uint32:
220+
case TypeUint32:
200221
v, offset, err := d.decodeUint(size, offset)
201222
if err != nil {
202223
return 0, err
203224
}
204225

205226
return offset, dser.Uint32(uint32(v))
206-
case _Uint64:
227+
case TypeUint64:
207228
v, offset, err := d.decodeUint(size, offset)
208229
if err != nil {
209230
return 0, err
210231
}
211232

212233
return offset, dser.Uint64(v)
213-
case _Uint128:
234+
case TypeUint128:
214235
v, offset, err := d.decodeUint128(size, offset)
215236
if err != nil {
216237
return 0, err
@@ -410,15 +431,15 @@ func (d *DataDecoder) decodeKey(offset uint) ([]byte, uint, error) {
410431
if err != nil {
411432
return nil, 0, err
412433
}
413-
if typeNum == _Pointer {
434+
if typeNum == TypePointer {
414435
pointer, ptrOffset, err := d.decodePointer(size, dataOffset)
415436
if err != nil {
416437
return nil, 0, err
417438
}
418439
key, _, err := d.decodeKey(pointer)
419440
return key, ptrOffset, err
420441
}
421-
if typeNum != _String {
442+
if typeNum != TypeString {
422443
return nil, 0, mmdberrors.NewInvalidDatabaseError(
423444
"unexpected type when decoding string: %v",
424445
typeNum,
@@ -443,16 +464,16 @@ func (d *DataDecoder) nextValueOffset(offset, numberToSkip uint) (uint, error) {
443464
return 0, err
444465
}
445466
switch typeNum {
446-
case _Pointer:
467+
case TypePointer:
447468
_, offset, err = d.decodePointer(size, offset)
448469
if err != nil {
449470
return 0, err
450471
}
451-
case _Map:
472+
case TypeMap:
452473
numberToSkip += 2 * size
453-
case _Slice:
474+
case TypeSlice:
454475
numberToSkip += size
455-
case _Bool:
476+
case TypeBool:
456477
default:
457478
offset += size
458479
}

internal/decoder/reflection.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func (d *Decoder) decode(offset uint, result reflect.Value, depth int) (uint, er
4949
return 0, err
5050
}
5151

52-
if typeNum != _Pointer && result.Kind() == reflect.Uintptr {
52+
if typeNum != TypePointer && result.Kind() == reflect.Uintptr {
5353
result.Set(reflect.ValueOf(uintptr(offset)))
5454
return d.nextValueOffset(offset, 1)
5555
}
@@ -71,7 +71,7 @@ func (d *Decoder) DecodePath(
7171
PATH:
7272
for i, v := range path {
7373
var (
74-
typeNum dataType
74+
typeNum Type
7575
size uint
7676
err error
7777
)
@@ -80,7 +80,7 @@ PATH:
8080
return err
8181
}
8282

83-
if typeNum == _Pointer {
83+
if typeNum == TypePointer {
8484
pointer, _, err := d.decodePointer(size, offset)
8585
if err != nil {
8686
return err
@@ -95,7 +95,7 @@ PATH:
9595
switch v := v.(type) {
9696
case string:
9797
// We are expecting a map
98-
if typeNum != _Map {
98+
if typeNum != TypeMap {
9999
// XXX - use type names in errors.
100100
return fmt.Errorf("expected a map for %s but found %d", v, typeNum)
101101
}
@@ -117,7 +117,7 @@ PATH:
117117
return nil
118118
case int:
119119
// We are expecting an array
120-
if typeNum != _Slice {
120+
if typeNum != TypeSlice {
121121
// XXX - use type names in errors.
122122
return fmt.Errorf("expected a slice for %d but found %d", v, typeNum)
123123
}
@@ -148,7 +148,7 @@ PATH:
148148
}
149149

150150
func (d *Decoder) decodeFromType(
151-
dtype dataType,
151+
dtype Type,
152152
size uint,
153153
offset uint,
154154
result reflect.Value,
@@ -158,31 +158,31 @@ func (d *Decoder) decodeFromType(
158158

159159
// For these types, size has a special meaning
160160
switch dtype {
161-
case _Bool:
161+
case TypeBool:
162162
return unmarshalBool(size, offset, result)
163-
case _Map:
163+
case TypeMap:
164164
return d.unmarshalMap(size, offset, result, depth)
165-
case _Pointer:
165+
case TypePointer:
166166
return d.unmarshalPointer(size, offset, result, depth)
167-
case _Slice:
167+
case TypeSlice:
168168
return d.unmarshalSlice(size, offset, result, depth)
169-
case _Bytes:
169+
case TypeBytes:
170170
return d.unmarshalBytes(size, offset, result)
171-
case _Float32:
171+
case TypeFloat32:
172172
return d.unmarshalFloat32(size, offset, result)
173-
case _Float64:
173+
case TypeFloat64:
174174
return d.unmarshalFloat64(size, offset, result)
175-
case _Int32:
175+
case TypeInt32:
176176
return d.unmarshalInt32(size, offset, result)
177-
case _Uint16:
177+
case TypeUint16:
178178
return d.unmarshalUint(size, offset, result, 16)
179-
case _Uint32:
179+
case TypeUint32:
180180
return d.unmarshalUint(size, offset, result, 32)
181-
case _Uint64:
181+
case TypeUint64:
182182
return d.unmarshalUint(size, offset, result, 64)
183-
case _String:
183+
case TypeString:
184184
return d.unmarshalString(size, offset, result)
185-
case _Uint128:
185+
case TypeUint128:
186186
return d.unmarshalUint128(size, offset, result)
187187
default:
188188
return 0, mmdberrors.NewInvalidDatabaseError("unknown type: %d", dtype)

0 commit comments

Comments
 (0)