diff options
-rw-r--r-- | optional/json.go | 35 | ||||
-rw-r--r-- | optional/json_test.go | 55 |
2 files changed, 90 insertions, 0 deletions
diff --git a/optional/json.go b/optional/json.go new file mode 100644 index 0000000..23aa780 --- /dev/null +++ b/optional/json.go @@ -0,0 +1,35 @@ +package optional + +import ( + "encoding/json" +) + +func (o *Optional[T]) UnmarshalJSON(data []byte) error { + var Buffer *T + + err := json.Unmarshal(data, &Buffer) + if err != nil { + return err + } + + if Buffer == nil { + var empty T + o.Value = empty + o.Exists = false + return nil + } + + o.Value = *Buffer + o.Exists = true + return nil +} + +func (o Optional[T]) MarshalJSON() ([]byte, error) { + var Buffer *T + + if o.Exists { + Buffer = &o.Value + } + + return json.Marshal(Buffer) +} diff --git a/optional/json_test.go b/optional/json_test.go new file mode 100644 index 0000000..132dea2 --- /dev/null +++ b/optional/json_test.go @@ -0,0 +1,55 @@ +package optional_test + +import ( + "encoding/json" + "testing" + + "xengineering.eu/optional-go/optional" +) + +func TestUnmarshal(t *testing.T) { + text := `{"something": null}` + + var Buffer struct { + Something optional.Optional[bool] + } + + err := json.Unmarshal([]byte(text), &Buffer) + if err != nil { + t.Fatal(err) + } + + if Buffer.Something.Value != false { + t.Fatal("Value of member set to 'null' is not default value.") + } + + if Buffer.Something.Exists == true { + t.Fatal("Member set to 'null' but Optional claims that it exists.") + } +} + +func TestMarshal(t *testing.T) { + Buffer := struct { + Something optional.Optional[bool] `json:"something"` + }{ + Something: optional.Optional[bool]{ + Value: false, + Exists: false, + }, + } + + result, err := json.Marshal(Buffer) + if err != nil { + t.Fatal(err) + } + + expectation := `{"something":null}` + + if string(result) != expectation { + t.Fatalf( + "Expected '%s' but marshalled '%s'\n", + expectation, + string(result), + ) + } +} |