Skip to content

Commit b614e15

Browse files
committed
Implement JSON Unmarshalling for Option
1 parent 4602003 commit b614e15

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

option/json.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,19 @@ func (o Option[T]) MarshalJSON() ([]byte, error) {
1111
}
1212

1313
var _ json.Marshaler = Option[struct{}]{}
14+
15+
func (o *Option[T]) UnmarshalJSON(data []byte) error {
16+
*o = None[T]()
17+
18+
if string(data) != "null" {
19+
var value T
20+
if err := json.Unmarshal(data, &value); err != nil {
21+
return err
22+
}
23+
*o = Some(value)
24+
}
25+
26+
return nil
27+
}
28+
29+
var _ json.Unmarshaler = &Option[struct{}]{}

option/json_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,28 @@ func TestMarshalNoneParsed(t *testing.T) {
3939
assert.Nil(t, err)
4040
assert.Equal(t, string(data), `{"middle_name":null}`)
4141
}
42+
43+
func TestUnmarshalSome(t *testing.T) {
44+
var number option.Option[int]
45+
err := json.Unmarshal([]byte("4"), &number)
46+
assert.Nil(t, err)
47+
assert.Equal(t, number, option.Some(4))
48+
}
49+
50+
func TestUnmarshalNone(t *testing.T) {
51+
var number option.Option[int]
52+
err := json.Unmarshal([]byte("null"), &number)
53+
assert.Nil(t, err)
54+
assert.True(t, number.IsNone())
55+
}
56+
57+
func TestUnmarshalEmpty(t *testing.T) {
58+
type name struct {
59+
MiddleName option.Option[string] `json:"middle_name"`
60+
}
61+
62+
var value name
63+
err := json.Unmarshal([]byte("{}"), &value)
64+
assert.Nil(t, err)
65+
assert.True(t, value.MiddleName.IsNone())
66+
}

0 commit comments

Comments
 (0)