wrapped_string.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package decoder
  2. import (
  3. "reflect"
  4. "unsafe"
  5. "github.com/goccy/go-json/internal/runtime"
  6. )
  7. type wrappedStringDecoder struct {
  8. typ *runtime.Type
  9. dec Decoder
  10. stringDecoder *stringDecoder
  11. structName string
  12. fieldName string
  13. isPtrType bool
  14. }
  15. func newWrappedStringDecoder(typ *runtime.Type, dec Decoder, structName, fieldName string) *wrappedStringDecoder {
  16. return &wrappedStringDecoder{
  17. typ: typ,
  18. dec: dec,
  19. stringDecoder: newStringDecoder(structName, fieldName),
  20. structName: structName,
  21. fieldName: fieldName,
  22. isPtrType: typ.Kind() == reflect.Ptr,
  23. }
  24. }
  25. func (d *wrappedStringDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
  26. bytes, err := d.stringDecoder.decodeStreamByte(s)
  27. if err != nil {
  28. return err
  29. }
  30. if bytes == nil {
  31. if d.isPtrType {
  32. *(*unsafe.Pointer)(p) = nil
  33. }
  34. return nil
  35. }
  36. b := make([]byte, len(bytes)+1)
  37. copy(b, bytes)
  38. if _, err := d.dec.Decode(&RuntimeContext{Buf: b}, 0, depth, p); err != nil {
  39. return err
  40. }
  41. return nil
  42. }
  43. func (d *wrappedStringDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  44. bytes, c, err := d.stringDecoder.decodeByte(ctx.Buf, cursor)
  45. if err != nil {
  46. return 0, err
  47. }
  48. if bytes == nil {
  49. if d.isPtrType {
  50. *(*unsafe.Pointer)(p) = nil
  51. }
  52. return c, nil
  53. }
  54. bytes = append(bytes, nul)
  55. oldBuf := ctx.Buf
  56. ctx.Buf = bytes
  57. if _, err := d.dec.Decode(ctx, 0, depth, p); err != nil {
  58. return 0, err
  59. }
  60. ctx.Buf = oldBuf
  61. return c, nil
  62. }