2023-10-11 01:15:23 +08:00
|
|
|
package strutil
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strconv"
|
|
|
|
sliceutil "tinyrdm/backend/utils/slice"
|
|
|
|
)
|
|
|
|
|
|
|
|
// EncodeRedisKey encode the redis key to integer array
|
|
|
|
// if key contains binary which could not display on ui, convert the key to char array
|
|
|
|
func EncodeRedisKey(key string) any {
|
2024-01-27 14:36:14 +08:00
|
|
|
if ContainsBinary(key) {
|
2023-10-11 01:15:23 +08:00
|
|
|
b := []byte(key)
|
|
|
|
arr := make([]int, len(b))
|
|
|
|
for i, bb := range b {
|
|
|
|
arr[i] = int(bb)
|
|
|
|
}
|
|
|
|
return arr
|
|
|
|
}
|
|
|
|
return key
|
|
|
|
}
|
|
|
|
|
|
|
|
// DecodeRedisKey decode redis key to readable string
|
|
|
|
func DecodeRedisKey(key any) string {
|
|
|
|
switch key.(type) {
|
|
|
|
case string:
|
|
|
|
return key.(string)
|
|
|
|
|
|
|
|
case []any:
|
|
|
|
arr := key.([]any)
|
|
|
|
bytes := sliceutil.Map(arr, func(i int) byte {
|
|
|
|
if c, ok := AnyToInt(arr[i]); ok {
|
|
|
|
return byte(c)
|
|
|
|
}
|
|
|
|
return '0'
|
|
|
|
})
|
|
|
|
return string(bytes)
|
|
|
|
|
|
|
|
case []int:
|
|
|
|
arr := key.([]int)
|
|
|
|
b := make([]byte, len(arr))
|
|
|
|
for i, bb := range arr {
|
|
|
|
b[i] = byte(bb)
|
|
|
|
}
|
|
|
|
return string(b)
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
// AnyToInt convert any value to int
|
|
|
|
func AnyToInt(val any) (int, bool) {
|
|
|
|
switch val.(type) {
|
|
|
|
case string:
|
|
|
|
num, err := strconv.Atoi(val.(string))
|
|
|
|
if err != nil {
|
|
|
|
return 0, false
|
|
|
|
}
|
|
|
|
return num, true
|
|
|
|
case float64:
|
|
|
|
return int(val.(float64)), true
|
|
|
|
case float32:
|
|
|
|
return int(val.(float32)), true
|
|
|
|
case int64:
|
|
|
|
return int(val.(int64)), true
|
|
|
|
case int32:
|
|
|
|
return int(val.(int32)), true
|
|
|
|
case int:
|
|
|
|
return val.(int), true
|
|
|
|
case bool:
|
|
|
|
if val.(bool) {
|
|
|
|
return 1, true
|
|
|
|
} else {
|
|
|
|
return 0, true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0, false
|
|
|
|
}
|