Skip to content

Commit af6e547

Browse files
committed
Support json marshall
1 parent 3cbaf74 commit af6e547

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

optional.go

+28
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package optional
22

3+
import (
4+
"encoding/json"
5+
"errors"
6+
)
7+
38
type Type[T any] struct {
49
wrapped interface{}
510
}
@@ -77,3 +82,26 @@ func FromPtr[T any](wrapped *T) Type[T] {
7782
return New[T](*wrapped)
7883
}
7984
}
85+
86+
// -- Marshaler and Unmarshaler ---
87+
88+
func (s Type[T]) MarshalJSON() ([]byte, error) {
89+
if w, ok := s.Value(); ok {
90+
return json.Marshal(w)
91+
} else {
92+
return json.Marshal(nil)
93+
}
94+
}
95+
96+
func (s *Type[T]) UnmarshalJSON(data []byte) error {
97+
if s == nil {
98+
return errors.New("optional.Type: UnmarshalJSON on nil pointer")
99+
}
100+
var w *T
101+
err := json.Unmarshal(data, &w)
102+
if err != nil {
103+
return err
104+
}
105+
*s = FromPtr(w)
106+
return nil
107+
}

optional_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package optional
22

33
import (
4+
"encoding/json"
45
"log"
56
"testing"
67
)
@@ -145,3 +146,28 @@ func TestValueOrDefault(t *testing.T) {
145146
assert(t, v2.ValueOrDefault(10) == 10, "ValueOrDefault failed")
146147
assert(t, v2.ValueOrLazyDefault(func() int { return 100 }) == 100, "ValueOrLazyDefault failed")
147148
}
149+
150+
func TestEncodeAndDecode(t *testing.T) {
151+
var v = New(New(123))
152+
data, err := json.Marshal(v)
153+
assert(t, err == nil, "")
154+
assert(t, string(data) == "123", "")
155+
156+
var v2 Type[Type[int]]
157+
err = json.Unmarshal(data, &v2)
158+
assert(t, err == nil, "")
159+
assert(t, !v2.IsNil(), "")
160+
if w, ok := Compact(v2).Value(); ok {
161+
assert(t, w == 123, "")
162+
}
163+
164+
// empty
165+
v3 := Nil[int]()
166+
data, err = json.Marshal(v3)
167+
assert(t, err == nil, "")
168+
assert(t, string(data) == "null", "")
169+
var v4 Type[int]
170+
err = json.Unmarshal(data, &v4)
171+
assert(t, err == nil, "")
172+
assert(t, v4.IsNil(), "")
173+
}

0 commit comments

Comments
 (0)