9 cmn "github.com/tendermint/tmlibs/common"
13 ErrBinaryReadOverflow = errors.New("Error: binary read overflow")
14 ErrBinaryReadInvalidLength = errors.New("Error: binary read invalid length")
15 ErrBinaryReadInvalidTimeNegative = errors.New("Error: binary read invalid time - negative")
16 ErrBinaryReadInvalidTimeSubMillisecond = errors.New("Error: binary read invalid time - sub millisecond")
17 ErrBinaryWriteOverflow = errors.New("Error: binary write overflow")
21 ReadSliceChunkSize = 1024
24 func ReadBinary(o interface{}, r io.Reader, lmt int, n *int, err *error) (res interface{}) {
25 rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
26 if rv.Kind() == reflect.Ptr {
28 // This allows ReadBinary() to return a nil pointer,
29 // if the value read is nil.
30 rvPtr := reflect.New(rt)
31 ReadBinaryPtr(rvPtr.Interface(), r, lmt, n, err)
32 res = rvPtr.Elem().Interface()
34 readReflectBinary(rv, rt, Options{}, r, lmt, n, err)
38 ptrRv := reflect.New(rt)
39 readReflectBinary(ptrRv.Elem(), rt, Options{}, r, lmt, n, err)
40 res = ptrRv.Elem().Interface()
42 if lmt != 0 && lmt < *n && *err == nil {
43 *err = ErrBinaryReadOverflow
48 func ReadBinaryPtr(o interface{}, r io.Reader, lmt int, n *int, err *error) (res interface{}) {
49 rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
50 if rv.Kind() == reflect.Ptr {
51 readReflectBinary(rv.Elem(), rt.Elem(), Options{}, r, lmt, n, err)
53 cmn.PanicSanity("ReadBinaryPtr expects o to be a pointer")
56 if lmt != 0 && lmt < *n && *err == nil {
57 *err = ErrBinaryReadOverflow
62 // WriteBinary is the binary encoder. Its arguments are the subject to be
63 // encoded, the writer that'll receive the encoded bytes, as well as a
64 // receiver to store the bytes written and any error encountered.
65 func WriteBinary(o interface{}, w io.Writer, n *int, err *error) {
66 rv := reflect.ValueOf(o)
67 rt := reflect.TypeOf(o)
68 writeReflectBinary(rv, rt, Options{}, w, n, err)
71 func ReadJSON(o interface{}, bytes []byte, err *error) interface{} {
72 var object interface{}
73 *err = json.Unmarshal(bytes, &object)
78 return ReadJSONObject(o, object, err)
81 func ReadJSONPtr(o interface{}, bytes []byte, err *error) interface{} {
82 var object interface{}
83 *err = json.Unmarshal(bytes, &object)
88 return ReadJSONObjectPtr(o, object, err)
91 // o is the ultimate destination, object is the result of json unmarshal
92 func ReadJSONObject(o interface{}, object interface{}, err *error) interface{} {
93 rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
94 if rv.Kind() == reflect.Ptr {
96 // This allows ReadJSONObject() to return a nil pointer
97 // if the value read is nil.
98 rvPtr := reflect.New(rt)
99 ReadJSONObjectPtr(rvPtr.Interface(), object, err)
100 return rvPtr.Elem().Interface()
102 readReflectJSON(rv, rt, Options{}, object, err)
106 ptrRv := reflect.New(rt)
107 readReflectJSON(ptrRv.Elem(), rt, Options{}, object, err)
108 return ptrRv.Elem().Interface()
112 func ReadJSONObjectPtr(o interface{}, object interface{}, err *error) interface{} {
113 rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
114 if rv.Kind() == reflect.Ptr {
115 readReflectJSON(rv.Elem(), rt.Elem(), Options{}, object, err)
117 cmn.PanicSanity("ReadJSON(Object)Ptr expects o to be a pointer")
122 func WriteJSON(o interface{}, w io.Writer, n *int, err *error) {
123 rv := reflect.ValueOf(o)
124 rt := reflect.TypeOf(o)
125 if rv.Kind() == reflect.Ptr {
126 rv, rt = rv.Elem(), rt.Elem()
128 writeReflectJSON(rv, rt, Options{}, w, n, err)
131 // Write all of bz to w
132 // Increment n and set err accordingly.
133 func WriteTo(bz []byte, w io.Writer, n *int, err *error) {
137 n_, err_ := w.Write(bz)
142 // Read len(buf) from r
143 // Increment n and set err accordingly.
144 func ReadFull(buf []byte, r io.Reader, n *int, err *error) {
148 n_, err_ := io.ReadFull(r, buf)