bytes.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package decoder
  2. import (
  3. "encoding/base64"
  4. "unsafe"
  5. "github.com/goccy/go-json/internal/errors"
  6. "github.com/goccy/go-json/internal/runtime"
  7. )
  8. type bytesDecoder struct {
  9. typ *runtime.Type
  10. sliceDecoder Decoder
  11. stringDecoder *stringDecoder
  12. structName string
  13. fieldName string
  14. }
  15. func byteUnmarshalerSliceDecoder(typ *runtime.Type, structName string, fieldName string) Decoder {
  16. var unmarshalDecoder Decoder
  17. switch {
  18. case runtime.PtrTo(typ).Implements(unmarshalJSONType):
  19. unmarshalDecoder = newUnmarshalJSONDecoder(runtime.PtrTo(typ), structName, fieldName)
  20. case runtime.PtrTo(typ).Implements(unmarshalTextType):
  21. unmarshalDecoder = newUnmarshalTextDecoder(runtime.PtrTo(typ), structName, fieldName)
  22. default:
  23. unmarshalDecoder, _ = compileUint8(typ, structName, fieldName)
  24. }
  25. return newSliceDecoder(unmarshalDecoder, typ, 1, structName, fieldName)
  26. }
  27. func newBytesDecoder(typ *runtime.Type, structName string, fieldName string) *bytesDecoder {
  28. return &bytesDecoder{
  29. typ: typ,
  30. sliceDecoder: byteUnmarshalerSliceDecoder(typ, structName, fieldName),
  31. stringDecoder: newStringDecoder(structName, fieldName),
  32. structName: structName,
  33. fieldName: fieldName,
  34. }
  35. }
  36. func (d *bytesDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
  37. bytes, err := d.decodeStreamBinary(s, depth, p)
  38. if err != nil {
  39. return err
  40. }
  41. if bytes == nil {
  42. s.reset()
  43. return nil
  44. }
  45. decodedLen := base64.StdEncoding.DecodedLen(len(bytes))
  46. buf := make([]byte, decodedLen)
  47. n, err := base64.StdEncoding.Decode(buf, bytes)
  48. if err != nil {
  49. return err
  50. }
  51. *(*[]byte)(p) = buf[:n]
  52. s.reset()
  53. return nil
  54. }
  55. func (d *bytesDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  56. bytes, c, err := d.decodeBinary(ctx, cursor, depth, p)
  57. if err != nil {
  58. return 0, err
  59. }
  60. if bytes == nil {
  61. return c, nil
  62. }
  63. cursor = c
  64. decodedLen := base64.StdEncoding.DecodedLen(len(bytes))
  65. b := make([]byte, decodedLen)
  66. n, err := base64.StdEncoding.Decode(b, bytes)
  67. if err != nil {
  68. return 0, err
  69. }
  70. *(*[]byte)(p) = b[:n]
  71. return cursor, nil
  72. }
  73. func (d *bytesDecoder) decodeStreamBinary(s *Stream, depth int64, p unsafe.Pointer) ([]byte, error) {
  74. c := s.skipWhiteSpace()
  75. if c == '[' {
  76. if d.sliceDecoder == nil {
  77. return nil, &errors.UnmarshalTypeError{
  78. Type: runtime.RType2Type(d.typ),
  79. Offset: s.totalOffset(),
  80. }
  81. }
  82. err := d.sliceDecoder.DecodeStream(s, depth, p)
  83. return nil, err
  84. }
  85. return d.stringDecoder.decodeStreamByte(s)
  86. }
  87. func (d *bytesDecoder) decodeBinary(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) ([]byte, int64, error) {
  88. buf := ctx.Buf
  89. cursor = skipWhiteSpace(buf, cursor)
  90. if buf[cursor] == '[' {
  91. if d.sliceDecoder == nil {
  92. return nil, 0, &errors.UnmarshalTypeError{
  93. Type: runtime.RType2Type(d.typ),
  94. Offset: cursor,
  95. }
  96. }
  97. c, err := d.sliceDecoder.Decode(ctx, cursor, depth, p)
  98. if err != nil {
  99. return nil, 0, err
  100. }
  101. return nil, c, nil
  102. }
  103. return d.stringDecoder.decodeByte(buf, cursor)
  104. }