diff options
author | xengineering <me@xengineering.eu> | 2024-11-08 18:21:09 +0100 |
---|---|---|
committer | xengineering <me@xengineering.eu> | 2024-11-08 18:21:09 +0100 |
commit | d8dbdaedcfb9099ae091a805972d380a7cddc4a4 (patch) | |
tree | ed5965bcdeed0c395604a7a46095d8c09a0f396b | |
parent | 08ea24952ece9c82a932910126975d26e486758c (diff) | |
download | optional-go-d8dbdaedcfb9099ae091a805972d380a7cddc4a4.tar optional-go-d8dbdaedcfb9099ae091a805972d380a7cddc4a4.tar.zst optional-go-d8dbdaedcfb9099ae091a805972d380a7cddc4a4.zip |
Add json (un)marshal supportv1.0.0
This allows to use optionals for fields of structs which are marshalled
or unmarshalled to or from JavaScript object notation (JSON).
-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), + ) + } +} |