Skip to content

Commit

Permalink
Homogenize treatment of params and meta in UnmarshalJSON (#52)
Browse files Browse the repository at this point in the history
This change makes the treatment of params and meta the same, by
assigning a well-known pointer at first to detect if the unmarshaling
process overwrites it with an explicit nil, or it stays the same in
which it means that it was unset from the beginning.
  • Loading branch information
lhchavez authored Aug 4, 2021
1 parent 120d461 commit 5f298fe
Showing 1 changed file with 11 additions and 5 deletions.
16 changes: 11 additions & 5 deletions jsonrpc2.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,12 @@ func (r Request) MarshalJSON() ([]byte, error) {
func (r *Request) UnmarshalJSON(data []byte) error {
r2 := make(map[string]interface{})

// Detect if the "params" field is JSON "null" or just not present
// by seeing if the field gets overwritten to nil.
// Detect if the "params" or "meta" fields are JSON "null" or just not
// present by seeing if the field gets overwritten to nil.
emptyParams := &json.RawMessage{}
r2["params"] = emptyParams
emptyMeta := &json.RawMessage{}
r2["meta"] = emptyMeta

decoder := json.NewDecoder(bytes.NewReader(data))
decoder.UseNumber()
Expand All @@ -112,9 +114,13 @@ func (r *Request) UnmarshalJSON(data []byte) error {
}
r.Params = (*json.RawMessage)(&b)
}
meta, ok := r2["meta"]
if ok {
b, err := json.Marshal(meta)
switch {
case r2["meta"] == nil:
r.Meta = &jsonNull
case r2["meta"] == emptyMeta:
r.Meta = nil
default:
b, err := json.Marshal(r2["meta"])
if err != nil {
return fmt.Errorf("failed to marshal Meta: %w", err)
}
Expand Down

0 comments on commit 5f298fe

Please sign in to comment.