File tree Expand file tree Collapse file tree 2 files changed +41
-0
lines changed Expand file tree Collapse file tree 2 files changed +41
-0
lines changed Original file line number Diff line number Diff line change @@ -11,3 +11,19 @@ func (o Option[T]) MarshalJSON() ([]byte, error) {
1111}
1212
1313var _ 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 {}]{}
Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments