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 }