1
0
mirror of https://github.com/astaxie/beego.git synced 2024-06-13 17:23:33 +00:00

Fix break API change

support int64 on 64-bit platform
This commit is contained in:
miraclesu 2017-06-28 16:56:37 +08:00
parent 2231841d74
commit 6e34f43721
4 changed files with 40 additions and 24 deletions

View File

@ -25,6 +25,8 @@ import (
const ( const (
// ValidTag struct tag // ValidTag struct tag
ValidTag = "valid" ValidTag = "valid"
wordsize = 32 << (^uint(0) >> 32 & 1)
) )
var ( var (
@ -43,6 +45,8 @@ var (
"Valid": true, "Valid": true,
"NoMatch": true, "NoMatch": true,
} }
Int64On32Err = fmt.Errorf("not support int64 on 32-bit platform")
) )
func init() { func init() {
@ -250,6 +254,9 @@ func parseParam(t reflect.Type, s string) (i interface{}, err error) {
case reflect.Int: case reflect.Int:
i, err = strconv.Atoi(s) i, err = strconv.Atoi(s)
case reflect.Int64: case reflect.Int64:
if wordsize == 32 {
return nil, Int64On32Err
}
i, err = strconv.ParseInt(s, 10, 64) i, err = strconv.ParseInt(s, 10, 64)
case reflect.Int32: case reflect.Int32:
var v int64 var v int64
@ -273,12 +280,12 @@ func parseParam(t reflect.Type, s string) (i interface{}, err error) {
i = s i = s
case reflect.Ptr: case reflect.Ptr:
if t.Elem().String() != "regexp.Regexp" { if t.Elem().String() != "regexp.Regexp" {
err = fmt.Errorf("does not support %s", t.Elem().String()) err = fmt.Errorf("not support %s", t.Elem().String())
return return
} }
i, err = regexp.Compile(s) i, err = regexp.Compile(s)
default: default:
err = fmt.Errorf("does not support %s", t.Kind().String()) err = fmt.Errorf("not support %s", t.Kind().String())
} }
return return
} }

View File

@ -144,17 +144,17 @@ func (v *Validation) Required(obj interface{}, key string) *Result {
} }
// Min Test that the obj is greater than min if obj's type is int // Min Test that the obj is greater than min if obj's type is int
func (v *Validation) Min(obj interface{}, min int64, key string) *Result { func (v *Validation) Min(obj interface{}, min int, key string) *Result {
return v.apply(Min{min, key}, obj) return v.apply(Min{min, key}, obj)
} }
// Max Test that the obj is less than max if obj's type is int // Max Test that the obj is less than max if obj's type is int
func (v *Validation) Max(obj interface{}, max int64, key string) *Result { func (v *Validation) Max(obj interface{}, max int, key string) *Result {
return v.apply(Max{max, key}, obj) return v.apply(Max{max, key}, obj)
} }
// Range Test that the obj is between mni and max if obj's type is int // Range Test that the obj is between mni and max if obj's type is int
func (v *Validation) Range(obj interface{}, min, max int64, key string) *Result { func (v *Validation) Range(obj interface{}, min, max int, key string) *Result {
return v.apply(Range{Min{Min: min}, Max{Max: max}, key}, obj) return v.apply(Range{Min{Min: min}, Max{Max: max}, key}, obj)
} }

View File

@ -64,10 +64,10 @@ func TestRequired(t *testing.T) {
func TestMin(t *testing.T) { func TestMin(t *testing.T) {
valid := Validation{} valid := Validation{}
if valid.Min(int64(-1), int64(0), "min0").Ok { if valid.Min(-1, 0, "min0").Ok {
t.Error("-1 is less than the minimum value of 0 should be false") t.Error("-1 is less than the minimum value of 0 should be false")
} }
if !valid.Min(int64(1), int64(0), "min0").Ok { if !valid.Min(1, 0, "min0").Ok {
t.Error("1 is greater or equal than the minimum value of 0 should be true") t.Error("1 is greater or equal than the minimum value of 0 should be true")
} }
} }
@ -75,10 +75,10 @@ func TestMin(t *testing.T) {
func TestMax(t *testing.T) { func TestMax(t *testing.T) {
valid := Validation{} valid := Validation{}
if valid.Max(int64(1), int64(0), "max0").Ok { if valid.Max(1, 0, "max0").Ok {
t.Error("1 is greater than the minimum value of 0 should be false") t.Error("1 is greater than the minimum value of 0 should be false")
} }
if !valid.Max(int64(-1), int64(0), "max0").Ok { if !valid.Max(-1, 0, "max0").Ok {
t.Error("-1 is less or equal than the maximum value of 0 should be true") t.Error("-1 is less or equal than the maximum value of 0 should be true")
} }
} }

View File

@ -161,24 +161,28 @@ func (r Required) GetLimitValue() interface{} {
// Min check struct // Min check struct
type Min struct { type Min struct {
Min int64 Min int
Key string Key string
} }
// IsSatisfied judge whether obj is valid // IsSatisfied judge whether obj is valid
// not support int64 on 32-bit platform
func (m Min) IsSatisfied(obj interface{}) bool { func (m Min) IsSatisfied(obj interface{}) bool {
var v int64 var v int
switch obj.(type) { switch obj.(type) {
case int64: case int64:
v = obj.(int64) if wordsize == 32 {
return false
}
v = int(obj.(int64))
case int: case int:
v = int64(obj.(int)) v = obj.(int)
case int32: case int32:
v = int64(obj.(int32)) v = int(obj.(int32))
case int16: case int16:
v = int64(obj.(int16)) v = int(obj.(int16))
case int8: case int8:
v = int64(obj.(int8)) v = int(obj.(int8))
default: default:
return false return false
} }
@ -203,24 +207,28 @@ func (m Min) GetLimitValue() interface{} {
// Max validate struct // Max validate struct
type Max struct { type Max struct {
Max int64 Max int
Key string Key string
} }
// IsSatisfied judge whether obj is valid // IsSatisfied judge whether obj is valid
// not support int64 on 32-bit platform
func (m Max) IsSatisfied(obj interface{}) bool { func (m Max) IsSatisfied(obj interface{}) bool {
var v int64 var v int
switch obj.(type) { switch obj.(type) {
case int64: case int64:
v = obj.(int64) if wordsize == 32 {
return false
}
v = int(obj.(int64))
case int: case int:
v = int64(obj.(int)) v = obj.(int)
case int32: case int32:
v = int64(obj.(int32)) v = int(obj.(int32))
case int16: case int16:
v = int64(obj.(int16)) v = int(obj.(int16))
case int8: case int8:
v = int64(obj.(int8)) v = int(obj.(int8))
default: default:
return false return false
} }
@ -251,6 +259,7 @@ type Range struct {
} }
// IsSatisfied judge whether obj is valid // IsSatisfied judge whether obj is valid
// not support int64 on 32-bit platform
func (r Range) IsSatisfied(obj interface{}) bool { func (r Range) IsSatisfied(obj interface{}) bool {
return r.Min.IsSatisfied(obj) && r.Max.IsSatisfied(obj) return r.Min.IsSatisfied(obj) && r.Max.IsSatisfied(obj)
} }
@ -267,7 +276,7 @@ func (r Range) GetKey() string {
// GetLimitValue return the limit value, Max // GetLimitValue return the limit value, Max
func (r Range) GetLimitValue() interface{} { func (r Range) GetLimitValue() interface{} {
return []int64{r.Min.Min, r.Max.Max} return []int{r.Min.Min, r.Max.Max}
} }
// MinSize Requires an array or string to be at least a given length. // MinSize Requires an array or string to be at least a given length.