mirror of
https://github.com/mudler/luet.git
synced 2025-07-11 14:23:10 +00:00
Instead of using gox on one side and an action to release, we can merge them together with goreleaser which will build for extra targets (arm, mips if needed in the future) and it also takes care of creating checksums, a source archive, and a changelog and creating a release with all the artifacts. All binaries should respect the old naming convention, so any scripts out there should still work. Signed-off-by: Itxaka <igarcia@suse.com>
167 lines
2.8 KiB
Go
167 lines
2.8 KiB
Go
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
|
|
}
|