Select Git revision
set.go 2.57 KiB
package reflection
import (
"fmt"
"reflect"
"strconv"
"strings"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors"
)
func SetValue(tgt reflect.Value, src interface{}) error {
if reflect.TypeOf(src) == tgt.Type() {
tgt.Set(reflect.ValueOf(src))
return nil
}
// need some kind of type conversion
switch tgt.Type().Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
// setting a signed integer
var i64 int64
strValue := fmt.Sprintf("%v", src)
if strValue != "" {
var err error
i64, err = strconv.ParseInt(strValue, 10, 64)
if err != nil {
return errors.Wrapf(err, "\"%s\" is not a number", strValue)
}
}
switch tgt.Type().Kind() {
case reflect.Int:
tgt.Set(reflect.ValueOf(int(i64)))
case reflect.Int8:
tgt.Set(reflect.ValueOf(int8(i64)))
case reflect.Int16:
tgt.Set(reflect.ValueOf(int16(i64)))
case reflect.Int32:
tgt.Set(reflect.ValueOf(int32(i64)))
case reflect.Int64:
tgt.Set(reflect.ValueOf(i64))
}
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
// parse to int for this struct field
var u64 uint64
strValue := fmt.Sprintf("%v", src)
if strValue != "" {
var err error
u64, err = strconv.ParseUint(strValue, 10, 64)
if err != nil {
return errors.Errorf("\"%s\" is not a number", strValue)
}
}
switch tgt.Type().Kind() {
case reflect.Uint:
tgt.Set(reflect.ValueOf(uint(u64)))
case reflect.Uint8:
tgt.Set(reflect.ValueOf(uint8(u64)))
case reflect.Uint16:
tgt.Set(reflect.ValueOf(uint16(u64)))
case reflect.Uint32:
tgt.Set(reflect.ValueOf(uint32(u64)))
case reflect.Uint64:
tgt.Set(reflect.ValueOf(u64))
}
case reflect.Bool:
strValue := strings.ToLower(fmt.Sprintf("%v", src))