46 lines
799 B
Go
46 lines
799 B
Go
package utils
|
|
|
|
import (
|
|
"reflect"
|
|
"sort"
|
|
"unicode"
|
|
)
|
|
|
|
type KeyValue struct {
|
|
Key string
|
|
Value any
|
|
}
|
|
|
|
func SortStruct(data any) []KeyValue {
|
|
v := reflect.ValueOf(data).Elem()
|
|
t := v.Type()
|
|
var kv []KeyValue
|
|
for i := 0; i < v.NumField(); i++ {
|
|
field := v.Field(i)
|
|
key := ToSnakeCase(t.Field(i).Name)
|
|
if field.IsZero() {
|
|
continue
|
|
}
|
|
kv = append(kv, KeyValue{Key: key, Value: field.Interface()})
|
|
}
|
|
sort.SliceStable(kv, func(i, j int) bool {
|
|
return kv[i].Key < kv[j].Key
|
|
})
|
|
return kv
|
|
}
|
|
|
|
func ToSnakeCase(s string) string {
|
|
var result []rune
|
|
for i, char := range s {
|
|
if unicode.IsUpper(char) {
|
|
if i > 0 {
|
|
result = append(result, '_')
|
|
}
|
|
result = append(result, unicode.ToLower(char))
|
|
} else {
|
|
result = append(result, char)
|
|
}
|
|
}
|
|
return string(result)
|
|
}
|