Skip to content

Commit 04b0cae

Browse files
committed
feat: Export msgpack ext encode/decode functions
Fixes #420.
1 parent 10b3c8f commit 04b0cae

File tree

5 files changed

+59
-54
lines changed

5 files changed

+59
-54
lines changed

arrow/arrow.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import (
77
"github.com/vmihailenco/msgpack/v5"
88
)
99

10-
// Arrow MessagePack extension type.
11-
const arrowExtId = 8
10+
// ExtID represents the Arrow MessagePack extension type identifier.
11+
const ExtID = 8
1212

1313
// Arrow struct wraps a raw arrow data buffer.
1414
type Arrow struct {
@@ -26,31 +26,31 @@ func (a Arrow) Raw() []byte {
2626
return a.data
2727
}
2828

29-
func arrowDecoder(d *msgpack.Decoder, v reflect.Value, extLen int) error {
29+
func DecodeExt(d *msgpack.Decoder, v reflect.Value, extLen int) error {
3030
arrow := Arrow{
3131
data: make([]byte, extLen),
3232
}
3333
n, err := d.Buffered().Read(arrow.data)
3434
if err != nil {
35-
return fmt.Errorf("arrowDecoder: can't read bytes on Arrow decode: %w", err)
35+
return fmt.Errorf("decode: can't read bytes on Arrow decode: %w", err)
3636
}
3737
if n < extLen || n != len(arrow.data) {
38-
return fmt.Errorf("arrowDecoder: unexpected end of stream after %d Arrow bytes", n)
38+
return fmt.Errorf("decode: unexpected end of stream after %d Arrow bytes", n)
3939
}
4040

4141
v.Set(reflect.ValueOf(arrow))
4242
return nil
4343
}
4444

45-
func arrowEncoder(e *msgpack.Encoder, v reflect.Value) ([]byte, error) {
45+
func EncodeExt(_ *msgpack.Encoder, v reflect.Value) ([]byte, error) {
4646
arr, ok := v.Interface().(Arrow)
4747
if !ok {
48-
return []byte{}, fmt.Errorf("arrowEncoder: not an Arrow type")
48+
return []byte{}, fmt.Errorf("encode: not an Arrow type")
4949
}
5050
return arr.data, nil
5151
}
5252

5353
func init() {
54-
msgpack.RegisterExtDecoder(arrowExtId, Arrow{}, arrowDecoder)
55-
msgpack.RegisterExtEncoder(arrowExtId, Arrow{}, arrowEncoder)
54+
msgpack.RegisterExtDecoder(ExtID, Arrow{}, DecodeExt)
55+
msgpack.RegisterExtEncoder(ExtID, Arrow{}, EncodeExt)
5656
}

datetime/datetime.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Package with support of Tarantool's datetime data type.
1+
// Package datetime provides support for Tarantool's datetime data type.
22
//
33
// Datetime data type supported in Tarantool since 2.10.
44
//
@@ -34,9 +34,10 @@ import (
3434
// * [optional] all the other fields (nsec, tzoffset, tzindex) if any of them
3535
// were having not 0 value. They are packed naturally in little-endian order;
3636

37-
// Datetime external type. Supported since Tarantool 2.10. See more details in
37+
// ExtID represents the Datetime MessagePack extension type identifier.
38+
// Supported since Tarantool 2.10. See more details in
3839
// issue https://github.com/tarantool/tarantool/issues/5946.
39-
const datetimeExtID = 4
40+
const ExtID = 4
4041

4142
// datetime structure keeps a number of seconds and nanoseconds since Unix Epoch.
4243
// Time is normalized by UTC, so time-zone offset is informative only.
@@ -242,7 +243,7 @@ func (d *Datetime) ToTime() time.Time {
242243
return d.time
243244
}
244245

245-
func datetimeEncoder(e *msgpack.Encoder, v reflect.Value) ([]byte, error) {
246+
func EncodeExt(_ *msgpack.Encoder, v reflect.Value) ([]byte, error) {
246247
dtime := v.Interface().(Datetime)
247248
tm := dtime.ToTime()
248249

@@ -275,7 +276,7 @@ func datetimeEncoder(e *msgpack.Encoder, v reflect.Value) ([]byte, error) {
275276
return buf, nil
276277
}
277278

278-
func datetimeDecoder(d *msgpack.Decoder, v reflect.Value, extLen int) error {
279+
func DecodeExt(d *msgpack.Decoder, v reflect.Value, extLen int) error {
279280
if extLen != maxSize && extLen != secondsSize {
280281
return fmt.Errorf("invalid data length: got %d, wanted %d or %d",
281282
extLen, secondsSize, maxSize)
@@ -333,6 +334,6 @@ func datetimeDecoder(d *msgpack.Decoder, v reflect.Value, extLen int) error {
333334
}
334335

335336
func init() {
336-
msgpack.RegisterExtDecoder(datetimeExtID, Datetime{}, datetimeDecoder)
337-
msgpack.RegisterExtEncoder(datetimeExtID, Datetime{}, datetimeEncoder)
337+
msgpack.RegisterExtDecoder(ExtID, Datetime{}, DecodeExt)
338+
msgpack.RegisterExtEncoder(ExtID, Datetime{}, EncodeExt)
338339
}

datetime/interval.go

+19-16
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import (
88
"github.com/vmihailenco/msgpack/v5"
99
)
1010

11-
const interval_extId = 6
11+
// IntervalExtID represents the Interval MessagePack extension type identifier.
12+
const IntervalExtID = 6
1213

1314
const (
1415
fieldYear = 0
@@ -74,7 +75,7 @@ func encodeIntervalValue(e *msgpack.Encoder, typ uint64, value int64) (err error
7475
if err == nil {
7576
if value > 0 {
7677
err = e.EncodeUint(uint64(value))
77-
} else if value < 0 {
78+
} else {
7879
err = e.EncodeInt(value)
7980
}
8081
}
@@ -181,20 +182,22 @@ func decodeInterval(d *msgpack.Decoder, v reflect.Value) (err error) {
181182
return nil
182183
}
183184

184-
func init() {
185-
msgpack.RegisterExtEncoder(interval_extId, Interval{},
186-
func(e *msgpack.Encoder, v reflect.Value) (ret []byte, err error) {
187-
var b bytes.Buffer
185+
func EncodeIntervalExt(_ *msgpack.Encoder, v reflect.Value) (ret []byte, err error) {
186+
var b bytes.Buffer
188187

189-
enc := msgpack.NewEncoder(&b)
190-
if err = encodeInterval(enc, v); err == nil {
191-
ret = b.Bytes()
192-
}
188+
enc := msgpack.NewEncoder(&b)
189+
if err = encodeInterval(enc, v); err == nil {
190+
ret = b.Bytes()
191+
}
193192

194-
return
195-
})
196-
msgpack.RegisterExtDecoder(interval_extId, Interval{},
197-
func(d *msgpack.Decoder, v reflect.Value, extLen int) error {
198-
return decodeInterval(d, v)
199-
})
193+
return
194+
}
195+
196+
func DecodeIntervalExt(d *msgpack.Decoder, v reflect.Value, _ int) error {
197+
return decodeInterval(d, v)
198+
}
199+
200+
func init() {
201+
msgpack.RegisterExtEncoder(IntervalExtID, Interval{}, EncodeIntervalExt)
202+
msgpack.RegisterExtDecoder(IntervalExtID, Interval{}, DecodeIntervalExt)
200203
}

decimal/decimal.go

+9-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Package decimal with support of Tarantool's decimal data type.
1+
// Package decimal provides support for Tarantool's decimal data type.
22
//
33
// Decimal data type supported in Tarantool since 2.2.
44
//
@@ -37,11 +37,10 @@ import (
3737
// - Tarantool module decimal:
3838
// https://www.tarantool.io/en/doc/latest/reference/reference_lua/decimal/
3939

40-
const (
41-
// Decimal external type.
42-
decimalExtID = 1
43-
decimalPrecision = 38
44-
)
40+
// ExtID represents the Decimal MessagePack extension type identifier.
41+
const ExtID = 1
42+
43+
const decimalPrecision = 38
4544

4645
var (
4746
one decimal.Decimal = decimal.NewFromInt(1)
@@ -71,7 +70,7 @@ func MakeDecimalFromString(src string) (Decimal, error) {
7170
return result, nil
7271
}
7372

74-
func decimalEncoder(e *msgpack.Encoder, v reflect.Value) ([]byte, error) {
73+
func EncodeExt(_ *msgpack.Encoder, v reflect.Value) ([]byte, error) {
7574
dec := v.Interface().(Decimal)
7675
if dec.GreaterThan(maxSupportedDecimal) {
7776
return nil,
@@ -94,7 +93,7 @@ func decimalEncoder(e *msgpack.Encoder, v reflect.Value) ([]byte, error) {
9493
return bcdBuf, nil
9594
}
9695

97-
func decimalDecoder(d *msgpack.Decoder, v reflect.Value, extLen int) error {
96+
func DecodeExt(d *msgpack.Decoder, v reflect.Value, extLen int) error {
9897
b := make([]byte, extLen)
9998
n, err := d.Buffered().Read(b)
10099
if err != nil {
@@ -131,6 +130,6 @@ func decimalDecoder(d *msgpack.Decoder, v reflect.Value, extLen int) error {
131130
}
132131

133132
func init() {
134-
msgpack.RegisterExtDecoder(decimalExtID, Decimal{}, decimalDecoder)
135-
msgpack.RegisterExtEncoder(decimalExtID, Decimal{}, decimalEncoder)
133+
msgpack.RegisterExtDecoder(ExtID, Decimal{}, DecodeExt)
134+
msgpack.RegisterExtEncoder(ExtID, Decimal{}, EncodeExt)
136135
}

uuid/uuid.go

+14-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Package with support of Tarantool's UUID data type.
1+
// Package uuid provides support for Tarantool's UUID data type.
22
//
33
// UUID data type supported in Tarantool since 2.4.1.
44
//
@@ -24,8 +24,8 @@ import (
2424
"github.com/vmihailenco/msgpack/v5"
2525
)
2626

27-
// UUID external type.
28-
const uuid_extID = 2
27+
// ExtID represents the UUID MessagePack extension type identifier.
28+
const ExtID = 2
2929

3030
func encodeUUID(e *msgpack.Encoder, v reflect.Value) error {
3131
id := v.Interface().(uuid.UUID)
@@ -64,15 +64,17 @@ func decodeUUID(d *msgpack.Decoder, v reflect.Value) error {
6464
return nil
6565
}
6666

67+
func EncodeExt(_ *msgpack.Encoder, v reflect.Value) ([]byte, error) {
68+
u := v.Interface().(uuid.UUID)
69+
return u.MarshalBinary()
70+
}
71+
72+
func DecodeExt(d *msgpack.Decoder, v reflect.Value, _ int) error {
73+
return decodeUUID(d, v)
74+
}
75+
6776
func init() {
6877
msgpack.Register(reflect.TypeOf((*uuid.UUID)(nil)).Elem(), encodeUUID, decodeUUID)
69-
msgpack.RegisterExtEncoder(uuid_extID, uuid.UUID{},
70-
func(e *msgpack.Encoder, v reflect.Value) ([]byte, error) {
71-
uuid := v.Interface().(uuid.UUID)
72-
return uuid.MarshalBinary()
73-
})
74-
msgpack.RegisterExtDecoder(uuid_extID, uuid.UUID{},
75-
func(d *msgpack.Decoder, v reflect.Value, extLen int) error {
76-
return decodeUUID(d, v)
77-
})
78+
msgpack.RegisterExtEncoder(ExtID, uuid.UUID{}, EncodeExt)
79+
msgpack.RegisterExtDecoder(ExtID, uuid.UUID{}, DecodeExt)
7880
}

0 commit comments

Comments
 (0)