bool.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package decoder
  2. import (
  3. "fmt"
  4. "unsafe"
  5. "github.com/goccy/go-json/internal/errors"
  6. )
  7. type boolDecoder struct {
  8. structName string
  9. fieldName string
  10. }
  11. func newBoolDecoder(structName, fieldName string) *boolDecoder {
  12. return &boolDecoder{structName: structName, fieldName: fieldName}
  13. }
  14. func (d *boolDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
  15. c := s.skipWhiteSpace()
  16. for {
  17. switch c {
  18. case 't':
  19. if err := trueBytes(s); err != nil {
  20. return err
  21. }
  22. **(**bool)(unsafe.Pointer(&p)) = true
  23. return nil
  24. case 'f':
  25. if err := falseBytes(s); err != nil {
  26. return err
  27. }
  28. **(**bool)(unsafe.Pointer(&p)) = false
  29. return nil
  30. case 'n':
  31. if err := nullBytes(s); err != nil {
  32. return err
  33. }
  34. return nil
  35. case nul:
  36. if s.read() {
  37. c = s.char()
  38. continue
  39. }
  40. goto ERROR
  41. }
  42. break
  43. }
  44. ERROR:
  45. return errors.ErrUnexpectedEndOfJSON("bool", s.totalOffset())
  46. }
  47. func (d *boolDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  48. buf := ctx.Buf
  49. cursor = skipWhiteSpace(buf, cursor)
  50. switch buf[cursor] {
  51. case 't':
  52. if err := validateTrue(buf, cursor); err != nil {
  53. return 0, err
  54. }
  55. cursor += 4
  56. **(**bool)(unsafe.Pointer(&p)) = true
  57. return cursor, nil
  58. case 'f':
  59. if err := validateFalse(buf, cursor); err != nil {
  60. return 0, err
  61. }
  62. cursor += 5
  63. **(**bool)(unsafe.Pointer(&p)) = false
  64. return cursor, nil
  65. case 'n':
  66. if err := validateNull(buf, cursor); err != nil {
  67. return 0, err
  68. }
  69. cursor += 4
  70. return cursor, nil
  71. }
  72. return 0, errors.ErrUnexpectedEndOfJSON("bool", cursor)
  73. }
  74. func (d *boolDecoder) DecodePath(ctx *RuntimeContext, cursor, depth int64) ([][]byte, int64, error) {
  75. return nil, 0, fmt.Errorf("json: bool decoder does not support decode path")
  76. }