tendermint/wire/wire.go

135 lines
3.4 KiB
Go
Raw Normal View History

2015-07-25 15:45:45 -07:00
package wire
2014-06-04 01:39:50 -07:00
import (
2015-01-05 14:04:42 -08:00
"encoding/json"
2015-07-07 18:35:21 -07:00
"errors"
"io"
"reflect"
2015-07-19 16:42:52 -07:00
. "github.com/tendermint/tendermint/common"
)
2014-06-04 01:39:50 -07:00
2015-07-07 18:35:21 -07:00
// TODO document and maybe make it configurable.
const MaxBinaryReadSize = 21 * 1024 * 1024
var ErrBinaryReadSizeOverflow = errors.New("Error: binary read size overflow")
var ErrBinaryReadSizeUnderflow = errors.New("Error: binary read size underflow")
2015-07-07 18:35:21 -07:00
func ReadBinary(o interface{}, r io.Reader, n *int64, err *error) interface{} {
rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
if rv.Kind() == reflect.Ptr {
if rv.IsNil() {
2015-07-11 18:01:21 -07:00
// This allows ReadBinaryObject() to return a nil pointer,
// if the value read is nil.
rvPtr := reflect.New(rt)
ReadBinaryPtr(rvPtr.Interface(), r, n, err)
return rvPtr.Elem().Interface()
} else {
readReflectBinary(rv, rt, Options{}, r, n, err)
return o
}
} else {
ptrRv := reflect.New(rt)
readReflectBinary(ptrRv.Elem(), rt, Options{}, r, n, err)
2014-12-17 01:37:13 -08:00
return ptrRv.Elem().Interface()
}
2014-06-05 11:45:18 -07:00
}
func ReadBinaryPtr(o interface{}, r io.Reader, n *int64, err *error) interface{} {
rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
if rv.Kind() == reflect.Ptr {
readReflectBinary(rv.Elem(), rt.Elem(), Options{}, r, n, err)
} else {
2015-07-19 16:42:52 -07:00
PanicSanity("ReadBinaryPtr expects o to be a pointer")
}
2015-07-19 16:42:52 -07:00
return o
}
func WriteBinary(o interface{}, w io.Writer, n *int64, err *error) {
rv := reflect.ValueOf(o)
rt := reflect.TypeOf(o)
writeReflectBinary(rv, rt, Options{}, w, n, err)
}
2015-01-05 14:04:42 -08:00
func ReadJSON(o interface{}, bytes []byte, err *error) interface{} {
var object interface{}
*err = json.Unmarshal(bytes, &object)
2015-01-05 14:04:42 -08:00
if *err != nil {
return o
}
2015-04-14 04:14:18 -07:00
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)
}
// o is the ultimate destination, object is the result of json unmarshal
2015-04-14 04:14:18 -07:00
func ReadJSONObject(o interface{}, object interface{}, err *error) interface{} {
2015-01-05 14:04:42 -08:00
rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
if rv.Kind() == reflect.Ptr {
if rv.IsNil() {
2015-07-11 18:01:21 -07:00
// This allows ReadJSONObject() to return a nil pointer
// if the value read is nil.
rvPtr := reflect.New(rt)
ReadJSONObjectPtr(rvPtr.Interface(), object, err)
return rvPtr.Elem().Interface()
} else {
readReflectJSON(rv, rt, object, err)
return o
}
2015-01-05 14:04:42 -08:00
} else {
ptrRv := reflect.New(rt)
readReflectJSON(ptrRv.Elem(), rt, object, err)
2015-01-05 14:04:42 -08:00
return ptrRv.Elem().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)
} else {
2015-07-19 16:42:52 -07:00
PanicSanity("ReadJSON(Object)Ptr expects o to be a pointer")
}
2015-07-19 16:42:52 -07:00
return o
}
2015-01-05 14:04:42 -08:00
func WriteJSON(o interface{}, w io.Writer, n *int64, err *error) {
rv := reflect.ValueOf(o)
rt := reflect.TypeOf(o)
if rv.Kind() == reflect.Ptr {
rv, rt = rv.Elem(), rt.Elem()
}
2015-01-05 14:04:42 -08:00
writeReflectJSON(rv, rt, w, n, err)
}
// Write all of bz to w
// Increment n and set err accordingly.
func WriteTo(bz []byte, w io.Writer, n *int64, err *error) {
if *err != nil {
return
2014-07-01 14:50:24 -07:00
}
n_, err_ := w.Write(bz)
*n += int64(n_)
*err = err_
}
// Read len(buf) from r
// Increment n and set err accordingly.
func ReadFull(buf []byte, r io.Reader, n *int64, err *error) {
if *err != nil {
return
}
n_, err_ := io.ReadFull(r, buf)
*n += int64(n_)
*err = err_
2014-06-04 01:39:50 -07:00
}