Skip to content

Commit 29cfc19

Browse files
committed
feat(arrow, datetime, decimal, uuid): add support for go-option
Add support for `go-option` to the `arrow`, `datetime`, `decimal`, and `uuid` packages. This allows for handling optional values of the `Arrow`, `Datetime`, `Interval`, `Decimal`, `UUID` and `BoxError` types. The following changes have been made: - Added `go:generate` directives to the `Arrow`, `Datetime`, `Interval`, `Decimal`, `UUID` and `BoxError` types to generate optional types using `github.com/tarantool/go-option/cmd/gentypes`. - Implemented `MarshalMsgpack` and `UnmarshalMsgpack` methods for the `Arrow`, `Datetime`, `Interval`, and `Decimal` types. - Added `marshalUUID` and `unmarshalUUID` functions for the `UUID` type. - The generated `_gen.go` files contain the `Optional*` types that wrap the original types and provide methods to handle optional values, including `EncodeMsgpack` and `DecodeMsgpack` for `msgpack` serialization. - Refactored the `datetime` and `decimal` decoders to use the new `UnmarshalMsgpack` methods.
1 parent 49b5c6d commit 29cfc19

22 files changed

+2425
-187
lines changed

arrow/arrow.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"github.com/vmihailenco/msgpack/v5"
88
)
99

10+
//go:generate go tool gentypes -ext-code 8 Arrow
11+
1012
// Arrow MessagePack extension type.
1113
const arrowExtId = 8
1214

@@ -26,6 +28,17 @@ func (a Arrow) Raw() []byte {
2628
return a.data
2729
}
2830

31+
// MarshalMsgpack implements a custom msgpack marshaler for extension type.
32+
func (a Arrow) MarshalMsgpack() ([]byte, error) {
33+
return a.data, nil
34+
}
35+
36+
// UnmarshalMsgpack implements a custom msgpack unmarshaler for extension type.
37+
func (a *Arrow) UnmarshalMsgpack(data []byte) error {
38+
a.data = data
39+
return nil
40+
}
41+
2942
func arrowDecoder(d *msgpack.Decoder, v reflect.Value, extLen int) error {
3043
arrow := Arrow{
3144
data: make([]byte, extLen),

arrow/arrow_gen.go

Lines changed: 241 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

arrow/arrow_gen_test.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package arrow
2+
3+
import (
4+
"bytes"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/vmihailenco/msgpack/v5"
9+
)
10+
11+
func TestSomeOptionalArrow(t *testing.T) {
12+
val, err := MakeArrow([]byte{1, 2, 3})
13+
assert.NoError(t, err)
14+
opt := SomeOptionalArrow(val)
15+
16+
assert.True(t, opt.IsSome())
17+
assert.False(t, opt.IsZero())
18+
19+
v, ok := opt.Get()
20+
assert.True(t, ok)
21+
assert.Equal(t, val, v)
22+
}
23+
24+
func TestNoneOptionalArrow(t *testing.T) {
25+
opt := NoneOptionalArrow()
26+
27+
assert.False(t, opt.IsSome())
28+
assert.True(t, opt.IsZero())
29+
30+
_, ok := opt.Get()
31+
assert.False(t, ok)
32+
}
33+
34+
func TestOptionalArrow_MustGet(t *testing.T) {
35+
val, err := MakeArrow([]byte{1, 2, 3})
36+
assert.NoError(t, err)
37+
optSome := SomeOptionalArrow(val)
38+
optNone := NoneOptionalArrow()
39+
40+
assert.Equal(t, val, optSome.MustGet())
41+
assert.Panics(t, func() { optNone.MustGet() })
42+
}
43+
44+
func TestOptionalArrow_Unwrap(t *testing.T) {
45+
val, err := MakeArrow([]byte{1, 2, 3})
46+
assert.NoError(t, err)
47+
optSome := SomeOptionalArrow(val)
48+
optNone := NoneOptionalArrow()
49+
50+
assert.Equal(t, val, optSome.Unwrap())
51+
assert.Equal(t, Arrow{}, optNone.Unwrap())
52+
}
53+
54+
func TestOptionalArrow_UnwrapOr(t *testing.T) {
55+
val, err := MakeArrow([]byte{1, 2, 3})
56+
assert.NoError(t, err)
57+
def, err := MakeArrow([]byte{4, 5, 6})
58+
assert.NoError(t, err)
59+
optSome := SomeOptionalArrow(val)
60+
optNone := NoneOptionalArrow()
61+
62+
assert.Equal(t, val, optSome.UnwrapOr(def))
63+
assert.Equal(t, def, optNone.UnwrapOr(def))
64+
}
65+
66+
func TestOptionalArrow_UnwrapOrElse(t *testing.T) {
67+
val, err := MakeArrow([]byte{1, 2, 3})
68+
assert.NoError(t, err)
69+
def, err := MakeArrow([]byte{4, 5, 6})
70+
assert.NoError(t, err)
71+
optSome := SomeOptionalArrow(val)
72+
optNone := NoneOptionalArrow()
73+
74+
assert.Equal(t, val, optSome.UnwrapOrElse(func() Arrow { return def }))
75+
assert.Equal(t, def, optNone.UnwrapOrElse(func() Arrow { return def }))
76+
}
77+
78+
func TestOptionalArrow_EncodeDecodeMsgpack(t *testing.T) {
79+
val, err := MakeArrow([]byte{1, 2, 3})
80+
assert.NoError(t, err)
81+
some := SomeOptionalArrow(val)
82+
none := NoneOptionalArrow()
83+
84+
var buf bytes.Buffer
85+
enc := msgpack.NewEncoder(&buf)
86+
dec := msgpack.NewDecoder(&buf)
87+
88+
// Test Some
89+
err = enc.Encode(some)
90+
assert.NoError(t, err)
91+
92+
var decodedSome OptionalArrow
93+
err = dec.Decode(&decodedSome)
94+
assert.NoError(t, err)
95+
assert.True(t, decodedSome.IsSome())
96+
assert.Equal(t, val, decodedSome.Unwrap())
97+
98+
// Test None
99+
buf.Reset()
100+
err = enc.Encode(none)
101+
assert.NoError(t, err)
102+
103+
var decodedNone OptionalArrow
104+
err = dec.Decode(&decodedNone)
105+
assert.NoError(t, err)
106+
assert.True(t, decodedNone.IsZero())
107+
108+
// Test invalid type
109+
buf.Reset()
110+
err = enc.Encode(123)
111+
assert.NoError(t, err)
112+
113+
var decodedInvalid OptionalArrow
114+
err = dec.Decode(&decodedInvalid)
115+
assert.Error(t, err)
116+
}

box_error.go renamed to boxerror.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99

1010
const errorExtID = 3
1111

12+
//go:generate go tool gentypes -ext-code 3 BoxError
13+
1214
const (
1315
keyErrorStack = 0x00
1416
keyErrorType = 0x00

0 commit comments

Comments
 (0)