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