bool.go 1.6 KB

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