You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
1.6 KiB

10 years ago
10 years ago
10 years ago
  1. package binary
  2. import (
  3. "encoding/json"
  4. "io"
  5. "reflect"
  6. )
  7. type Unreader interface {
  8. io.Reader
  9. UnreadByte() error
  10. }
  11. func ReadBinary(o interface{}, r Unreader, n *int64, err *error) interface{} {
  12. rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
  13. if rv.Kind() == reflect.Ptr {
  14. readReflect(rv.Elem(), rt.Elem(), r, n, err)
  15. return o
  16. } else {
  17. ptrRv := reflect.New(rt)
  18. readReflect(ptrRv.Elem(), rt, r, n, err)
  19. return ptrRv.Elem().Interface()
  20. }
  21. }
  22. func WriteBinary(o interface{}, w io.Writer, n *int64, err *error) {
  23. rv := reflect.ValueOf(o)
  24. rt := reflect.TypeOf(o)
  25. writeReflect(rv, rt, w, n, err)
  26. }
  27. func ReadJSON(o interface{}, bytes []byte, err *error) interface{} {
  28. var parsed interface{}
  29. *err = json.Unmarshal(bytes, &parsed)
  30. if *err != nil {
  31. return o
  32. }
  33. rv, rt := reflect.ValueOf(o), reflect.TypeOf(o)
  34. if rv.Kind() == reflect.Ptr {
  35. readReflectJSON(rv.Elem(), rt.Elem(), parsed, err)
  36. return o
  37. } else {
  38. ptrRv := reflect.New(rt)
  39. readReflectJSON(ptrRv.Elem(), rt, parsed, err)
  40. return ptrRv.Elem().Interface()
  41. }
  42. }
  43. func WriteJSON(o interface{}, w io.Writer, n *int64, err *error) {
  44. rv := reflect.ValueOf(o)
  45. rt := reflect.TypeOf(o)
  46. writeReflectJSON(rv, rt, w, n, err)
  47. }
  48. // Write all of bz to w
  49. // Increment n and set err accordingly.
  50. func WriteTo(bz []byte, w io.Writer, n *int64, err *error) {
  51. if *err != nil {
  52. return
  53. }
  54. n_, err_ := w.Write(bz)
  55. *n += int64(n_)
  56. *err = err_
  57. }
  58. // Read len(buf) from r
  59. // Increment n and set err accordingly.
  60. func ReadFull(buf []byte, r io.Reader, n *int64, err *error) {
  61. if *err != nil {
  62. return
  63. }
  64. n_, err_ := io.ReadFull(r, buf)
  65. *n += int64(n_)
  66. *err = err_
  67. }