Skip to content

Commit 7431d70

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 7431d70

22 files changed

+2473
-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: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
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_Some(t *testing.T) {
79+
val, err := MakeArrow([]byte{1, 2, 3})
80+
assert.NoError(t, err)
81+
some := SomeOptionalArrow(val)
82+
83+
var buf bytes.Buffer
84+
enc := msgpack.NewEncoder(&buf)
85+
dec := msgpack.NewDecoder(&buf)
86+
87+
err = enc.Encode(some)
88+
assert.NoError(t, err)
89+
90+
var decodedSome OptionalArrow
91+
err = dec.Decode(&decodedSome)
92+
assert.NoError(t, err)
93+
assert.True(t, decodedSome.IsSome())
94+
assert.Equal(t, val, decodedSome.Unwrap())
95+
}
96+
97+
func TestOptionalArrow_EncodeDecodeMsgpack_None(t *testing.T) {
98+
none := NoneOptionalArrow()
99+
100+
var buf bytes.Buffer
101+
enc := msgpack.NewEncoder(&buf)
102+
dec := msgpack.NewDecoder(&buf)
103+
104+
err := enc.Encode(none)
105+
assert.NoError(t, err)
106+
107+
var decodedNone OptionalArrow
108+
err = dec.Decode(&decodedNone)
109+
assert.NoError(t, err)
110+
assert.True(t, decodedNone.IsZero())
111+
}
112+
113+
func TestOptionalArrow_EncodeDecodeMsgpack_InvalidType(t *testing.T) {
114+
var buf bytes.Buffer
115+
enc := msgpack.NewEncoder(&buf)
116+
dec := msgpack.NewDecoder(&buf)
117+
118+
err := enc.Encode(123)
119+
assert.NoError(t, err)
120+
121+
var decodedInvalid OptionalArrow
122+
err = dec.Decode(&decodedInvalid)
123+
assert.Error(t, err)
124+
}

0 commit comments

Comments
 (0)