gopkg.in/rethinkdb/rethinkdb-go.v6@v6.2.2/encoding/utils.go (about)

     1  package encoding
     2  
     3  import "reflect"
     4  
     5  func getTypeKind(t reflect.Type) reflect.Kind {
     6  	kind := t.Kind()
     7  
     8  	switch {
     9  	case kind >= reflect.Int && kind <= reflect.Int64:
    10  		return reflect.Int
    11  	case kind >= reflect.Uint && kind <= reflect.Uint64:
    12  		return reflect.Uint
    13  	case kind >= reflect.Float32 && kind <= reflect.Float64:
    14  		return reflect.Float32
    15  	default:
    16  		return kind
    17  	}
    18  }
    19  
    20  func isEmptyValue(v reflect.Value) bool {
    21  	switch v.Kind() {
    22  	case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
    23  		return v.Len() == 0
    24  	case reflect.Bool:
    25  		return !v.Bool()
    26  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    27  		return v.Int() == 0
    28  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
    29  		return v.Uint() == 0
    30  	case reflect.Float32, reflect.Float64:
    31  		return v.Float() == 0
    32  	case reflect.Interface, reflect.Ptr:
    33  		return v.IsNil()
    34  	}
    35  	return false
    36  }
    37  
    38  func fieldByIndex(v reflect.Value, index []int) reflect.Value {
    39  	for _, i := range index {
    40  		if v.Kind() == reflect.Ptr {
    41  			if v.IsNil() {
    42  				v.Set(reflect.New(v.Type().Elem()))
    43  			}
    44  			v = v.Elem()
    45  		}
    46  		v = v.Field(i)
    47  	}
    48  
    49  	return v
    50  }
    51  
    52  func typeByIndex(t reflect.Type, index []int) reflect.Type {
    53  	for _, i := range index {
    54  		if t.Kind() == reflect.Ptr {
    55  			t = t.Elem()
    56  		}
    57  		t = t.Field(i).Type
    58  	}
    59  	return t
    60  }
    61  
    62  // valueByString sorts reflect.Value by the string value, this is useful for
    63  // sorting the result of MapKeys
    64  type valueByString []reflect.Value
    65  
    66  func (x valueByString) Len() int { return len(x) }
    67  
    68  func (x valueByString) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
    69  
    70  func (x valueByString) Less(i, j int) bool {
    71  	return x[i].String() < x[j].String()
    72  }