any_str.go raw

   1  package jsoniter
   2  
   3  import (
   4  	"fmt"
   5  	"strconv"
   6  )
   7  
   8  type stringAny struct {
   9  	baseAny
  10  	val string
  11  }
  12  
  13  func (any *stringAny) Get(path ...interface{}) Any {
  14  	if len(path) == 0 {
  15  		return any
  16  	}
  17  	return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)}
  18  }
  19  
  20  func (any *stringAny) Parse() *Iterator {
  21  	return nil
  22  }
  23  
  24  func (any *stringAny) ValueType() ValueType {
  25  	return StringValue
  26  }
  27  
  28  func (any *stringAny) MustBeValid() Any {
  29  	return any
  30  }
  31  
  32  func (any *stringAny) LastError() error {
  33  	return nil
  34  }
  35  
  36  func (any *stringAny) ToBool() bool {
  37  	str := any.ToString()
  38  	if str == "0" {
  39  		return false
  40  	}
  41  	for _, c := range str {
  42  		switch c {
  43  		case ' ', '\n', '\r', '\t':
  44  		default:
  45  			return true
  46  		}
  47  	}
  48  	return false
  49  }
  50  
  51  func (any *stringAny) ToInt() int {
  52  	return int(any.ToInt64())
  53  
  54  }
  55  
  56  func (any *stringAny) ToInt32() int32 {
  57  	return int32(any.ToInt64())
  58  }
  59  
  60  func (any *stringAny) ToInt64() int64 {
  61  	if any.val == "" {
  62  		return 0
  63  	}
  64  
  65  	flag := 1
  66  	startPos := 0
  67  	if any.val[0] == '+' || any.val[0] == '-' {
  68  		startPos = 1
  69  	}
  70  
  71  	if any.val[0] == '-' {
  72  		flag = -1
  73  	}
  74  
  75  	endPos := startPos
  76  	for i := startPos; i < len(any.val); i++ {
  77  		if any.val[i] >= '0' && any.val[i] <= '9' {
  78  			endPos = i + 1
  79  		} else {
  80  			break
  81  		}
  82  	}
  83  	parsed, _ := strconv.ParseInt(any.val[startPos:endPos], 10, 64)
  84  	return int64(flag) * parsed
  85  }
  86  
  87  func (any *stringAny) ToUint() uint {
  88  	return uint(any.ToUint64())
  89  }
  90  
  91  func (any *stringAny) ToUint32() uint32 {
  92  	return uint32(any.ToUint64())
  93  }
  94  
  95  func (any *stringAny) ToUint64() uint64 {
  96  	if any.val == "" {
  97  		return 0
  98  	}
  99  
 100  	startPos := 0
 101  
 102  	if any.val[0] == '-' {
 103  		return 0
 104  	}
 105  	if any.val[0] == '+' {
 106  		startPos = 1
 107  	}
 108  
 109  	endPos := startPos
 110  	for i := startPos; i < len(any.val); i++ {
 111  		if any.val[i] >= '0' && any.val[i] <= '9' {
 112  			endPos = i + 1
 113  		} else {
 114  			break
 115  		}
 116  	}
 117  	parsed, _ := strconv.ParseUint(any.val[startPos:endPos], 10, 64)
 118  	return parsed
 119  }
 120  
 121  func (any *stringAny) ToFloat32() float32 {
 122  	return float32(any.ToFloat64())
 123  }
 124  
 125  func (any *stringAny) ToFloat64() float64 {
 126  	if len(any.val) == 0 {
 127  		return 0
 128  	}
 129  
 130  	// first char invalid
 131  	if any.val[0] != '+' && any.val[0] != '-' && (any.val[0] > '9' || any.val[0] < '0') {
 132  		return 0
 133  	}
 134  
 135  	// extract valid num expression from string
 136  	// eg 123true => 123, -12.12xxa => -12.12
 137  	endPos := 1
 138  	for i := 1; i < len(any.val); i++ {
 139  		if any.val[i] == '.' || any.val[i] == 'e' || any.val[i] == 'E' || any.val[i] == '+' || any.val[i] == '-' {
 140  			endPos = i + 1
 141  			continue
 142  		}
 143  
 144  		// end position is the first char which is not digit
 145  		if any.val[i] >= '0' && any.val[i] <= '9' {
 146  			endPos = i + 1
 147  		} else {
 148  			endPos = i
 149  			break
 150  		}
 151  	}
 152  	parsed, _ := strconv.ParseFloat(any.val[:endPos], 64)
 153  	return parsed
 154  }
 155  
 156  func (any *stringAny) ToString() string {
 157  	return any.val
 158  }
 159  
 160  func (any *stringAny) WriteTo(stream *Stream) {
 161  	stream.WriteString(any.val)
 162  }
 163  
 164  func (any *stringAny) GetInterface() interface{} {
 165  	return any.val
 166  }
 167