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.

175 lines
2.9 KiB

  1. package msgpack
  2. import (
  3. "fmt"
  4. "reflect"
  5. "github.com/vmihailenco/msgpack/codes"
  6. )
  7. func (d *Decoder) bytesLen(c codes.Code) (int, error) {
  8. if c == codes.Nil {
  9. return -1, nil
  10. } else if codes.IsFixedString(c) {
  11. return int(c & codes.FixedStrMask), nil
  12. }
  13. switch c {
  14. case codes.Str8, codes.Bin8:
  15. n, err := d.uint8()
  16. return int(n), err
  17. case codes.Str16, codes.Bin16:
  18. n, err := d.uint16()
  19. return int(n), err
  20. case codes.Str32, codes.Bin32:
  21. n, err := d.uint32()
  22. return int(n), err
  23. }
  24. return 0, fmt.Errorf("msgpack: invalid code=%x decoding bytes length", c)
  25. }
  26. func (d *Decoder) DecodeString() (string, error) {
  27. c, err := d.readCode()
  28. if err != nil {
  29. return "", err
  30. }
  31. return d.string(c)
  32. }
  33. func (d *Decoder) string(c codes.Code) (string, error) {
  34. n, err := d.bytesLen(c)
  35. if err != nil {
  36. return "", err
  37. }
  38. if n == -1 {
  39. return "", nil
  40. }
  41. b, err := d.readN(n)
  42. return string(b), err
  43. }
  44. func decodeStringValue(d *Decoder, v reflect.Value) error {
  45. s, err := d.DecodeString()
  46. if err != nil {
  47. return err
  48. }
  49. if err = mustSet(v); err != nil {
  50. return err
  51. }
  52. v.SetString(s)
  53. return nil
  54. }
  55. func (d *Decoder) DecodeBytesLen() (int, error) {
  56. c, err := d.readCode()
  57. if err != nil {
  58. return 0, err
  59. }
  60. return d.bytesLen(c)
  61. }
  62. func (d *Decoder) DecodeBytes() ([]byte, error) {
  63. c, err := d.readCode()
  64. if err != nil {
  65. return nil, err
  66. }
  67. return d.bytes(c, nil)
  68. }
  69. func (d *Decoder) bytes(c codes.Code, b []byte) ([]byte, error) {
  70. n, err := d.bytesLen(c)
  71. if err != nil {
  72. return nil, err
  73. }
  74. if n == -1 {
  75. return nil, nil
  76. }
  77. return readN(d.r, b, n)
  78. }
  79. func (d *Decoder) bytesNoCopy() ([]byte, error) {
  80. c, err := d.readCode()
  81. if err != nil {
  82. return nil, err
  83. }
  84. n, err := d.bytesLen(c)
  85. if err != nil {
  86. return nil, err
  87. }
  88. if n == -1 {
  89. return nil, nil
  90. }
  91. return d.readN(n)
  92. }
  93. func (d *Decoder) decodeBytesPtr(ptr *[]byte) error {
  94. c, err := d.readCode()
  95. if err != nil {
  96. return err
  97. }
  98. return d.bytesPtr(c, ptr)
  99. }
  100. func (d *Decoder) bytesPtr(c codes.Code, ptr *[]byte) error {
  101. n, err := d.bytesLen(c)
  102. if err != nil {
  103. return err
  104. }
  105. if n == -1 {
  106. *ptr = nil
  107. return nil
  108. }
  109. *ptr, err = readN(d.r, *ptr, n)
  110. return err
  111. }
  112. func (d *Decoder) skipBytes(c codes.Code) error {
  113. n, err := d.bytesLen(c)
  114. if err != nil {
  115. return err
  116. }
  117. if n == -1 {
  118. return nil
  119. }
  120. return d.skipN(n)
  121. }
  122. func decodeBytesValue(d *Decoder, v reflect.Value) error {
  123. c, err := d.readCode()
  124. if err != nil {
  125. return err
  126. }
  127. b, err := d.bytes(c, v.Bytes())
  128. if err != nil {
  129. return err
  130. }
  131. if err = mustSet(v); err != nil {
  132. return err
  133. }
  134. v.SetBytes(b)
  135. return nil
  136. }
  137. func decodeByteArrayValue(d *Decoder, v reflect.Value) error {
  138. c, err := d.readCode()
  139. if err != nil {
  140. return err
  141. }
  142. n, err := d.bytesLen(c)
  143. if err != nil {
  144. return err
  145. }
  146. if n == -1 {
  147. return nil
  148. }
  149. if n > v.Len() {
  150. return fmt.Errorf("%s len is %d, but msgpack has %d elements", v.Type(), v.Len(), n)
  151. }
  152. b := v.Slice(0, n).Bytes()
  153. return d.readFull(b)
  154. }