core/util/util.go
2023-11-10 21:01:31 +01:00

142 lines
2.7 KiB
Go

package util
import (
"bytes"
"encoding/hex"
"fmt"
"log"
"math"
"path"
"reflect"
"strconv"
"strings"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
func PrependToSliceStr(strs *[]string, prefix string) {
for i, elm := range *strs {
(*strs)[i] = prefix + elm
}
}
func AppendToSliceStr(strs *[]string, suffix string) {
for i, elm := range *strs {
(*strs)[i] = elm + suffix
}
}
func Str2int64(str string, base int, fallback int64) int64 {
str = strings.TrimSuffix(str, "\n")
num, err := strconv.ParseInt(str, base, 64)
if err != nil {
num = fallback
}
return num
}
func Str2int(str string, base int, fallback int) int {
return int(Str2int64(str, base, int64(fallback)))
}
func CastStrings2ints(strs *[]string) []int {
a := make([]int, len(*strs))
for i, elm := range *strs {
var f int = Str2int(elm, 10, 0)
a[i] = f
}
return a
}
func PrettyByteSize(b int64) string {
bf := float64(b)
for _, unit := range []string{"", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"} {
if math.Abs(bf) < 1024.0 {
return fmt.Sprintf("%3.2f%s", bf, unit)
}
bf /= 1024.0
}
return fmt.Sprintf("%.2fYi", bf)
}
func Ucfirst(str *string) {
caser := cases.Title(language.English)
*str = caser.String(*str)
}
func RemoveExtension(fileName string) string {
return strings.TrimSuffix(fileName, path.Ext(fileName))
}
func GetBytesAsHex(key []byte) []byte {
dst := make([]byte, hex.EncodedLen(len(key)))
hex.Encode(dst, key)
return dst
}
func GetBytesFromHex(key []byte) []byte {
dst := make([]byte, hex.DecodedLen(len(key)))
n, err := hex.Decode(dst, key)
if err != nil {
log.Fatal(err)
}
return dst[:n]
}
func Escape(str string, c rune) string {
var buf bytes.Buffer
for _, char := range str {
switch char {
case c:
buf.WriteRune('\\')
}
buf.WriteRune(char)
}
return buf.String()
}
func EscapeBt(str string) string {
return Escape(str, '`')
}
func EscapeDquote(str string) string {
return Escape(str, '"')
}
func EscapeSquote(str string) string {
return Escape(str, '\'')
}
func InspectStruct(a any) (map[string]string, bool) {
done := false
rs := make(map[string]string)
n := reflect.ValueOf(a)
for {
if n.Kind() == reflect.Ptr {
n = n.Elem()
} else if n.Kind() == reflect.Struct {
break
} else {
return rs, done
}
}
for i := 0; i < n.NumField(); i++ {
rs[n.Type().Field(i).Name] = n.Field(i).Type().String()
}
done = true
return rs, done
}
func InArray(v interface{}, arr interface{}) int {
values := reflect.ValueOf(arr)
if reflect.TypeOf(arr).Kind() == reflect.Slice || values.Len() > 0 {
for i := 0; i < values.Len(); i++ {
if reflect.DeepEqual(v, values.Index(i).Interface()) {
return i
}
}
}
return -1
}