Skip to content

Commit

Permalink
fix(option): fix Option. UnmarshalJSON
Browse files Browse the repository at this point in the history
Change-Id: I991fb08dfa29fa2cd841c58ffc509a6e20dce981
  • Loading branch information
andeya committed Oct 25, 2022
1 parent bb07364 commit 314983b
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
9 changes: 8 additions & 1 deletion option.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package gust
import (
"encoding/json"
"fmt"
"unsafe"
)

// BoolOpt wraps a value as an Option.
Expand Down Expand Up @@ -404,14 +405,20 @@ func (o *Option[T]) Replace(some T) (old Option[T]) {
return old
}

const null = "null"

func (o Option[T]) MarshalJSON() ([]byte, error) {
if o.IsNone() {
return []byte("null"), nil
return []byte(null), nil
}
return json.Marshal(o.value)
}

func (o *Option[T]) UnmarshalJSON(b []byte) error {
o.value = nil
if *(*string)(unsafe.Pointer(&b)) == null {
return nil
}
var value = new(T)
err := json.Unmarshal(b, value)
if err == nil {
Expand Down
32 changes: 32 additions & 0 deletions option_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,35 @@ func TestOptionJSON(t *testing.T) {
assert.True(t, r4.IsNone())
assert.Equal(t, "json: cannot unmarshal number into Go value of type gust_test.T", err4.Error())
}

func TestOptionJSON2(t *testing.T) {
type T struct {
Name gust.Option[string]
}
var r = T{Name: gust.Some("andeya")}
var b, err = json.Marshal(r)
assert.NoError(t, err)
assert.Equal(t, `{"Name":"andeya"}`, string(b))
var r2 T
err2 := json.Unmarshal(b, &r2)
assert.NoError(t, err2)
assert.Equal(t, r, r2)

var r3 = T{Name: gust.Some("")}
var b3, err3 = json.Marshal(r3)
assert.NoError(t, err3)
assert.Equal(t, `{"Name":""}`, string(b3))
var r4 T
err4 := json.Unmarshal(b3, &r4)
assert.NoError(t, err4)
assert.Equal(t, r3, r4)

var r5 = T{Name: gust.None[string]()}
var b5, err5 = json.Marshal(r5)
assert.NoError(t, err5)
assert.Equal(t, `{"Name":null}`, string(b5))
var r6 T
err6 := json.Unmarshal(b5, &r6)
assert.NoError(t, err6)
assert.Equal(t, r5, r6)
}

0 comments on commit 314983b

Please sign in to comment.