in marshal.go [825:1025]
func unmarshalIntlike(info TypeInfo, int64Val int64, data []byte, value interface{}) error {
switch v := value.(type) {
case *int:
if ^uint(0) == math.MaxUint32 && (int64Val < math.MinInt32 || int64Val > math.MaxInt32) {
return unmarshalErrorf("unmarshal int: value %d out of range for %T", int64Val, *v)
}
*v = int(int64Val)
return nil
case *uint:
unitVal := uint64(int64Val)
switch info.Type() {
case TypeInt:
*v = uint(unitVal) & 0xFFFFFFFF
case TypeSmallInt:
*v = uint(unitVal) & 0xFFFF
case TypeTinyInt:
*v = uint(unitVal) & 0xFF
default:
if ^uint(0) == math.MaxUint32 && (int64Val < 0 || int64Val > math.MaxUint32) {
return unmarshalErrorf("unmarshal int: value %d out of range for %T", unitVal, *v)
}
*v = uint(unitVal)
}
return nil
case *int64:
*v = int64Val
return nil
case *uint64:
switch info.Type() {
case TypeInt:
*v = uint64(int64Val) & 0xFFFFFFFF
case TypeSmallInt:
*v = uint64(int64Val) & 0xFFFF
case TypeTinyInt:
*v = uint64(int64Val) & 0xFF
default:
*v = uint64(int64Val)
}
return nil
case *int32:
if int64Val < math.MinInt32 || int64Val > math.MaxInt32 {
return unmarshalErrorf("unmarshal int: value %d out of range for %T", int64Val, *v)
}
*v = int32(int64Val)
return nil
case *uint32:
switch info.Type() {
case TypeInt:
*v = uint32(int64Val) & 0xFFFFFFFF
case TypeSmallInt:
*v = uint32(int64Val) & 0xFFFF
case TypeTinyInt:
*v = uint32(int64Val) & 0xFF
default:
if int64Val < 0 || int64Val > math.MaxUint32 {
return unmarshalErrorf("unmarshal int: value %d out of range for %T", int64Val, *v)
}
*v = uint32(int64Val) & 0xFFFFFFFF
}
return nil
case *int16:
if int64Val < math.MinInt16 || int64Val > math.MaxInt16 {
return unmarshalErrorf("unmarshal int: value %d out of range for %T", int64Val, *v)
}
*v = int16(int64Val)
return nil
case *uint16:
switch info.Type() {
case TypeSmallInt:
*v = uint16(int64Val) & 0xFFFF
case TypeTinyInt:
*v = uint16(int64Val) & 0xFF
default:
if int64Val < 0 || int64Val > math.MaxUint16 {
return unmarshalErrorf("unmarshal int: value %d out of range for %T", int64Val, *v)
}
*v = uint16(int64Val) & 0xFFFF
}
return nil
case *int8:
if int64Val < math.MinInt8 || int64Val > math.MaxInt8 {
return unmarshalErrorf("unmarshal int: value %d out of range for %T", int64Val, *v)
}
*v = int8(int64Val)
return nil
case *uint8:
if info.Type() != TypeTinyInt && (int64Val < 0 || int64Val > math.MaxUint8) {
return unmarshalErrorf("unmarshal int: value %d out of range for %T", int64Val, *v)
}
*v = uint8(int64Val) & 0xFF
return nil
case *big.Int:
decBigInt2C(data, v)
return nil
case *string:
*v = strconv.FormatInt(int64Val, 10)
return nil
}
rv := reflect.ValueOf(value)
if rv.Kind() != reflect.Ptr {
return unmarshalErrorf("can not unmarshal into non-pointer %T", value)
}
rv = rv.Elem()
switch rv.Type().Kind() {
case reflect.Int:
if ^uint(0) == math.MaxUint32 && (int64Val < math.MinInt32 || int64Val > math.MaxInt32) {
return unmarshalErrorf("unmarshal int: value %d out of range", int64Val)
}
rv.SetInt(int64Val)
return nil
case reflect.Int64:
rv.SetInt(int64Val)
return nil
case reflect.Int32:
if int64Val < math.MinInt32 || int64Val > math.MaxInt32 {
return unmarshalErrorf("unmarshal int: value %d out of range", int64Val)
}
rv.SetInt(int64Val)
return nil
case reflect.Int16:
if int64Val < math.MinInt16 || int64Val > math.MaxInt16 {
return unmarshalErrorf("unmarshal int: value %d out of range", int64Val)
}
rv.SetInt(int64Val)
return nil
case reflect.Int8:
if int64Val < math.MinInt8 || int64Val > math.MaxInt8 {
return unmarshalErrorf("unmarshal int: value %d out of range", int64Val)
}
rv.SetInt(int64Val)
return nil
case reflect.Uint:
unitVal := uint64(int64Val)
switch info.Type() {
case TypeInt:
rv.SetUint(unitVal & 0xFFFFFFFF)
case TypeSmallInt:
rv.SetUint(unitVal & 0xFFFF)
case TypeTinyInt:
rv.SetUint(unitVal & 0xFF)
default:
if ^uint(0) == math.MaxUint32 && (int64Val < 0 || int64Val > math.MaxUint32) {
return unmarshalErrorf("unmarshal int: value %d out of range for %s", unitVal, rv.Type())
}
rv.SetUint(unitVal)
}
return nil
case reflect.Uint64:
unitVal := uint64(int64Val)
switch info.Type() {
case TypeInt:
rv.SetUint(unitVal & 0xFFFFFFFF)
case TypeSmallInt:
rv.SetUint(unitVal & 0xFFFF)
case TypeTinyInt:
rv.SetUint(unitVal & 0xFF)
default:
rv.SetUint(unitVal)
}
return nil
case reflect.Uint32:
unitVal := uint64(int64Val)
switch info.Type() {
case TypeInt:
rv.SetUint(unitVal & 0xFFFFFFFF)
case TypeSmallInt:
rv.SetUint(unitVal & 0xFFFF)
case TypeTinyInt:
rv.SetUint(unitVal & 0xFF)
default:
if int64Val < 0 || int64Val > math.MaxUint32 {
return unmarshalErrorf("unmarshal int: value %d out of range for %s", int64Val, rv.Type())
}
rv.SetUint(unitVal & 0xFFFFFFFF)
}
return nil
case reflect.Uint16:
unitVal := uint64(int64Val)
switch info.Type() {
case TypeSmallInt:
rv.SetUint(unitVal & 0xFFFF)
case TypeTinyInt:
rv.SetUint(unitVal & 0xFF)
default:
if int64Val < 0 || int64Val > math.MaxUint16 {
return unmarshalErrorf("unmarshal int: value %d out of range for %s", int64Val, rv.Type())
}
rv.SetUint(unitVal & 0xFFFF)
}
return nil
case reflect.Uint8:
if info.Type() != TypeTinyInt && (int64Val < 0 || int64Val > math.MaxUint8) {
return unmarshalErrorf("unmarshal int: value %d out of range for %s", int64Val, rv.Type())
}
rv.SetUint(uint64(int64Val) & 0xff)
return nil
}
return unmarshalErrorf("can not unmarshal %s into %T. Accepted types: big.Int, Marshaler, int8, uint8, int16, uint16, int, uint, int32, uint32, int64, uint64, string.", info, value)
}