Skip to content

Commit 2bec2bb

Browse files
committed
Allow unmarshalling ints to uints and uints to ints
1 parent bfd1341 commit 2bec2bb

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

decoder.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,12 @@ func (d *decoder) unmarshalInt32(size uint, offset uint, result reflect.Value) (
211211
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
212212
result.SetInt(int64(value))
213213
return newOffset, nil
214+
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
215+
if value < 0 {
216+
return 0, fmt.Errorf("trying to unmarshal %v into %v", value, result.Type())
217+
}
218+
result.SetUint(uint64(value))
219+
return newOffset, nil
214220
case reflect.Interface:
215221
result.Set(reflect.ValueOf(value))
216222
return newOffset, nil
@@ -287,6 +293,9 @@ func (d *decoder) unmarshalUint(size uint, offset uint, result reflect.Value, ui
287293
switch result.Kind() {
288294
default:
289295
return newOffset, fmt.Errorf("trying to unmarshal %v into %v", value, result.Type())
296+
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
297+
result.SetInt(int64(value))
298+
return newOffset, nil
290299
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
291300
result.SetUint(value)
292301
return newOffset, nil

reader_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,25 @@ func (s *MySuite) TestDecoder(c *C) {
155155
}
156156
}
157157

158+
func (s *MySuite) TestDecodingUint16IntoInt(c *C) {
159+
reader, err := Open("test-data/test-data/MaxMind-DB-test-decoder.mmdb")
160+
if err != nil {
161+
c.Logf("unexpected error while opening database: %v", err)
162+
c.Fail()
163+
}
164+
165+
var result struct {
166+
Uint16 int `maxminddb:"uint16"`
167+
}
168+
err = reader.Lookup(net.ParseIP("::1.1.1.0"), &result)
169+
if err != nil {
170+
c.Log(err)
171+
c.Fail()
172+
}
173+
174+
c.Assert(result.Uint16, Equals, 100)
175+
}
176+
158177
func (s *MySuite) TestIpv6inIpv4(c *C) {
159178
reader, err := Open("test-data/test-data/MaxMind-DB-test-ipv4-24.mmdb")
160179
if err != nil {

0 commit comments

Comments
 (0)