Skip to content
Snippets Groups Projects
Select Git revision
  • e6db4ae450eef9c94b26234d19057bab93168f9b
  • main default protected
  • v1.298.0
  • v1.297.0
  • v1.296.0
  • v1.295.0
  • v1.294.0
  • v1.293.0
  • v1.292.0
  • v1.291.0
  • v1.290.0
  • v1.289.0
  • v1.288.0
  • v1.287.0
  • v1.286.0
  • v1.285.0
  • v1.284.0
  • v1.283.0
  • v1.282.0
  • v1.281.0
  • v1.280.0
  • v1.279.0
22 results

set.go

Blame
  • 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))