feature_any_string.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package jsoniter
  2. import (
  3. "io"
  4. )
  5. type stringLazyAny struct{
  6. baseAny
  7. buf []byte
  8. iter *Iterator
  9. err error
  10. cache string
  11. }
  12. func (any *stringLazyAny) ValueType() ValueType {
  13. return String
  14. }
  15. func (any *stringLazyAny) Parse() *Iterator {
  16. iter := any.iter
  17. if iter == nil {
  18. iter = NewIterator()
  19. any.iter = iter
  20. }
  21. iter.ResetBytes(any.buf)
  22. return iter
  23. }
  24. func (any *stringLazyAny) fillCache() {
  25. if any.err != nil {
  26. return
  27. }
  28. iter := any.Parse()
  29. any.cache = iter.ReadString()
  30. if iter.Error != io.EOF {
  31. iter.reportError("stringLazyAny", "there are bytes left")
  32. }
  33. any.err = iter.Error
  34. }
  35. func (any *stringLazyAny) LastError() error {
  36. return any.err
  37. }
  38. func (any *stringLazyAny) ToBool() bool {
  39. str := any.ToString()
  40. if str == "false" {
  41. return false
  42. }
  43. for _, c := range str {
  44. switch c {
  45. case ' ', '\n', '\r', '\t':
  46. default:
  47. return true
  48. }
  49. }
  50. return false
  51. }
  52. func (any *stringLazyAny) ToInt() int {
  53. iter := any.Parse()
  54. iter.head++
  55. val := iter.ReadInt()
  56. any.err = iter.Error
  57. return val
  58. }
  59. func (any *stringLazyAny) ToInt32() int32 {
  60. iter := any.Parse()
  61. iter.head++
  62. val := iter.ReadInt32()
  63. any.err = iter.Error
  64. return val
  65. }
  66. func (any *stringLazyAny) ToInt64() int64 {
  67. iter := any.Parse()
  68. iter.head++
  69. val := iter.ReadInt64()
  70. any.err = iter.Error
  71. return val
  72. }
  73. func (any *stringLazyAny) ToFloat32() float32 {
  74. iter := any.Parse()
  75. iter.head++
  76. val := iter.ReadFloat32()
  77. any.err = iter.Error
  78. return val
  79. }
  80. func (any *stringLazyAny) ToFloat64() float64 {
  81. iter := any.Parse()
  82. iter.head++
  83. val := iter.ReadFloat64()
  84. any.err = iter.Error
  85. return val
  86. }
  87. func (any *stringLazyAny) ToString() string {
  88. any.fillCache()
  89. return any.cache
  90. }
  91. func (any *stringLazyAny) WriteTo(stream *Stream) {
  92. stream.Write(any.buf)
  93. }
  94. func (any *stringLazyAny) GetInterface() interface{} {
  95. any.fillCache()
  96. return any.cache
  97. }