simplifying json
parent
a4c60c2fd8
commit
abaaa9e908
@ -1,15 +1,41 @@
|
|||||||
package wire
|
package wire
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
type Request struct {
|
type Request struct {
|
||||||
Seq int `json:"seq"`
|
Seq int
|
||||||
Type string `json:"type"`
|
Body Value
|
||||||
Body interface{} `json:"body"`
|
}
|
||||||
|
|
||||||
|
func (r Request) MarshalJSON() ([]byte, error) {
|
||||||
|
return json.Marshal([]interface{}{r.Seq, r.Body.NetTag(), r.Body})
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRequest(seq int, v Value) Request {
|
func (r *Request) UnmarshalJSON(b []byte) error {
|
||||||
return Request{
|
var parts [3]json.RawMessage
|
||||||
Seq: seq,
|
if err := json.Unmarshal(b, &parts); err != nil {
|
||||||
Type: v.NetTag(),
|
return err
|
||||||
Body: v,
|
}
|
||||||
|
if err := json.Unmarshal(parts[0], &r.Seq); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var tag string
|
||||||
|
if err := json.Unmarshal(parts[1], &tag); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
f, ok := registry[tag]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("unknown tag: %q", tag)
|
||||||
|
}
|
||||||
|
v := f()
|
||||||
|
if err := json.Unmarshal(parts[2], v); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
r.Body = v
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue