mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-18 15:41:20 +00:00
Distinguish between ReadJSON vs ReadJSONPtr. The latter expects a non-nil pointer to write into. The former creates new things intelligently
This commit is contained in:
@ -16,6 +16,10 @@ var ErrBinaryReadSizeUnderflow = errors.New("Error: binary read size underflow")
|
|||||||
func ReadBinary(o interface{}, r io.Reader, n *int64, err *error) interface{} {
|
func ReadBinary(o interface{}, r io.Reader, n *int64, err *error) interface{} {
|
||||||
rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
|
rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
|
||||||
if rv.Kind() == reflect.Ptr {
|
if rv.Kind() == reflect.Ptr {
|
||||||
|
if rv.IsNil() {
|
||||||
|
rv = reflect.New(rt.Elem())
|
||||||
|
o = rv.Interface()
|
||||||
|
}
|
||||||
readReflectBinary(rv, rt, Options{}, r, n, err)
|
readReflectBinary(rv, rt, Options{}, r, n, err)
|
||||||
return o
|
return o
|
||||||
} else {
|
} else {
|
||||||
@ -51,10 +55,24 @@ func ReadJSON(o interface{}, bytes []byte, err *error) interface{} {
|
|||||||
return ReadJSONObject(o, object, err)
|
return ReadJSONObject(o, object, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ReadJSONPtr(o interface{}, bytes []byte, err *error) interface{} {
|
||||||
|
var object interface{}
|
||||||
|
*err = json.Unmarshal(bytes, &object)
|
||||||
|
if *err != nil {
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
return ReadJSONObjectPtr(o, object, err)
|
||||||
|
}
|
||||||
|
|
||||||
func ReadJSONObject(o interface{}, object interface{}, err *error) interface{} {
|
func ReadJSONObject(o interface{}, object interface{}, err *error) interface{} {
|
||||||
rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
|
rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
|
||||||
if rv.Kind() == reflect.Ptr {
|
if rv.Kind() == reflect.Ptr {
|
||||||
readReflectJSON(rv.Elem(), rt.Elem(), object, err)
|
if rv.IsNil() {
|
||||||
|
rv = reflect.New(rt.Elem())
|
||||||
|
o = rv.Interface()
|
||||||
|
}
|
||||||
|
readReflectJSON(rv, rt, object, err)
|
||||||
return o
|
return o
|
||||||
} else {
|
} else {
|
||||||
ptrRv := reflect.New(rt)
|
ptrRv := reflect.New(rt)
|
||||||
@ -63,6 +81,16 @@ func ReadJSONObject(o interface{}, object interface{}, err *error) interface{} {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ReadJSONObjectPtr(o interface{}, object interface{}, err *error) interface{} {
|
||||||
|
rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
|
||||||
|
if rv.Kind() == reflect.Ptr {
|
||||||
|
readReflectJSON(rv.Elem(), rt.Elem(), object, err)
|
||||||
|
return o
|
||||||
|
} else {
|
||||||
|
panic("ReadJSON(Object)Ptr expects o to be a pointer")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func WriteJSON(o interface{}, w io.Writer, n *int64, err *error) {
|
func WriteJSON(o interface{}, w io.Writer, n *int64, err *error) {
|
||||||
rv := reflect.ValueOf(o)
|
rv := reflect.ValueOf(o)
|
||||||
rt := reflect.TypeOf(o)
|
rt := reflect.TypeOf(o)
|
||||||
|
@ -69,7 +69,7 @@ func NewNode() *Node {
|
|||||||
} else {
|
} else {
|
||||||
genDocBytes := stateDB.Get(sm.GenDocKey)
|
genDocBytes := stateDB.Get(sm.GenDocKey)
|
||||||
err := new(error)
|
err := new(error)
|
||||||
binary.ReadJSON(&genDoc, genDocBytes, err)
|
binary.ReadJSONPtr(&genDoc, genDocBytes, err)
|
||||||
if *err != nil {
|
if *err != nil {
|
||||||
panic(Fmt("Unable to read gendoc from db: %v", err))
|
panic(Fmt("Unable to read gendoc from db: %v", err))
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,7 @@ func jsonParamsToArgs(rpcFunc *RPCFunc, params []interface{}) ([]reflect.Value,
|
|||||||
func _jsonObjectToArg(ty reflect.Type, object interface{}) (reflect.Value, error) {
|
func _jsonObjectToArg(ty reflect.Type, object interface{}) (reflect.Value, error) {
|
||||||
var err error
|
var err error
|
||||||
v := reflect.New(ty)
|
v := reflect.New(ty)
|
||||||
binary.ReadJSONObject(v.Interface(), object, &err)
|
binary.ReadJSONObjectPtr(v.Interface(), object, &err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return v, err
|
return v, err
|
||||||
}
|
}
|
||||||
@ -198,7 +198,7 @@ func httpParamsToArgs(rpcFunc *RPCFunc, r *http.Request) ([]reflect.Value, error
|
|||||||
func _jsonStringToArg(ty reflect.Type, arg string) (reflect.Value, error) {
|
func _jsonStringToArg(ty reflect.Type, arg string) (reflect.Value, error) {
|
||||||
var err error
|
var err error
|
||||||
v := reflect.New(ty)
|
v := reflect.New(ty)
|
||||||
binary.ReadJSON(v.Interface(), []byte(arg), &err)
|
binary.ReadJSONPtr(v.Interface(), []byte(arg), &err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return v, err
|
return v, err
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ type GenesisDoc struct {
|
|||||||
|
|
||||||
func GenesisDocFromJSON(jsonBlob []byte) (genState *GenesisDoc) {
|
func GenesisDocFromJSON(jsonBlob []byte) (genState *GenesisDoc) {
|
||||||
var err error
|
var err error
|
||||||
binary.ReadJSON(&genState, jsonBlob, &err)
|
binary.ReadJSONPtr(&genState, jsonBlob, &err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(Fmt("Couldn't read GenesisDoc: %v", err))
|
log.Error(Fmt("Couldn't read GenesisDoc: %v", err))
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
Reference in New Issue
Block a user