73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
|
package encoding
|
||
|
|
||
|
import "reflect"
|
||
|
|
||
|
func getTypeKind(t reflect.Type) reflect.Kind {
|
||
|
kind := t.Kind()
|
||
|
|
||
|
switch {
|
||
|
case kind >= reflect.Int && kind <= reflect.Int64:
|
||
|
return reflect.Int
|
||
|
case kind >= reflect.Uint && kind <= reflect.Uint64:
|
||
|
return reflect.Uint
|
||
|
case kind >= reflect.Float32 && kind <= reflect.Float64:
|
||
|
return reflect.Float32
|
||
|
default:
|
||
|
return kind
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func isEmptyValue(v reflect.Value) bool {
|
||
|
switch v.Kind() {
|
||
|
case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
|
||
|
return v.Len() == 0
|
||
|
case reflect.Bool:
|
||
|
return !v.Bool()
|
||
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||
|
return v.Int() == 0
|
||
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||
|
return v.Uint() == 0
|
||
|
case reflect.Float32, reflect.Float64:
|
||
|
return v.Float() == 0
|
||
|
case reflect.Interface, reflect.Ptr:
|
||
|
return v.IsNil()
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func fieldByIndex(v reflect.Value, index []int) reflect.Value {
|
||
|
for _, i := range index {
|
||
|
if v.Kind() == reflect.Ptr {
|
||
|
if v.IsNil() {
|
||
|
v.Set(reflect.New(v.Type().Elem()))
|
||
|
}
|
||
|
v = v.Elem()
|
||
|
}
|
||
|
v = v.Field(i)
|
||
|
}
|
||
|
|
||
|
return v
|
||
|
}
|
||
|
|
||
|
func typeByIndex(t reflect.Type, index []int) reflect.Type {
|
||
|
for _, i := range index {
|
||
|
if t.Kind() == reflect.Ptr {
|
||
|
t = t.Elem()
|
||
|
}
|
||
|
t = t.Field(i).Type
|
||
|
}
|
||
|
return t
|
||
|
}
|
||
|
|
||
|
// valueByString sorts reflect.Value by the string value, this is useful for
|
||
|
// sorting the result of MapKeys
|
||
|
type valueByString []reflect.Value
|
||
|
|
||
|
func (x valueByString) Len() int { return len(x) }
|
||
|
|
||
|
func (x valueByString) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
|
||
|
|
||
|
func (x valueByString) Less(i, j int) bool {
|
||
|
return x[i].String() < x[j].String()
|
||
|
}
|