package jsoniter import ( "fmt" "strconv" ) type stringAny struct { baseAny val string } func (any *stringAny) Get(path ...interface{}) Any { if len(path) == 0 { return any } return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} } func (any *stringAny) Parse() *Iterator { return nil } func (any *stringAny) ValueType() ValueType { return StringValue } func (any *stringAny) MustBeValid() Any { return any } func (any *stringAny) LastError() error { return nil } func (any *stringAny) ToBool() bool { str := any.ToString() if str == "0" { return false } for _, c := range str { switch c { case ' ', '\n', '\r', '\t': default: return true } } return false } func (any *stringAny) ToInt() int { return int(any.ToInt64()) } func (any *stringAny) ToInt32() int32 { return int32(any.ToInt64()) } func (any *stringAny) ToInt64() int64 { if any.val == "" { return 0 } flag := 1 startPos := 0 if any.val[0] == '+' || any.val[0] == '-' { startPos = 1 } if any.val[0] == '-' { flag = -1 } endPos := startPos for i := startPos; i < len(any.val); i++ { if any.val[i] >= '0' && any.val[i] <= '9' { endPos = i + 1 } else { break } } parsed, _ := strconv.ParseInt(any.val[startPos:endPos], 10, 64) return int64(flag) * parsed } func (any *stringAny) ToUint() uint { return uint(any.ToUint64()) } func (any *stringAny) ToUint32() uint32 { return uint32(any.ToUint64()) } func (any *stringAny) ToUint64() uint64 { if any.val == "" { return 0 } startPos := 0 if any.val[0] == '-' { return 0 } if any.val[0] == '+' { startPos = 1 } endPos := startPos for i := startPos; i < len(any.val); i++ { if any.val[i] >= '0' && any.val[i] <= '9' { endPos = i + 1 } else { break } } parsed, _ := strconv.ParseUint(any.val[startPos:endPos], 10, 64) return parsed } func (any *stringAny) ToFloat32() float32 { return float32(any.ToFloat64()) } func (any *stringAny) ToFloat64() float64 { if len(any.val) == 0 { return 0 } // first char invalid if any.val[0] != '+' && any.val[0] != '-' && (any.val[0] > '9' || any.val[0] < '0') { return 0 } // extract valid num expression from string // eg 123true => 123, -12.12xxa => -12.12 endPos := 1 for i := 1; i < len(any.val); i++ { if any.val[i] == '.' || any.val[i] == 'e' || any.val[i] == 'E' || any.val[i] == '+' || any.val[i] == '-' { endPos = i + 1 continue } // end position is the first char which is not digit if any.val[i] >= '0' && any.val[i] <= '9' { endPos = i + 1 } else { endPos = i break } } parsed, _ := strconv.ParseFloat(any.val[:endPos], 64) return parsed } func (any *stringAny) ToString() string { return any.val } func (any *stringAny) WriteTo(stream *Stream) { stream.WriteString(any.val) } func (any *stringAny) GetInterface() interface{} { return any.val }