Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix support for aliased time.Time types #890

Merged
merged 1 commit into from May 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
202 changes: 100 additions & 102 deletions baked_in.go
Expand Up @@ -816,19 +816,18 @@ func isNeField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return true
}

if fieldType == timeType {
if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {

t := currentField.Interface().(time.Time)
fieldTime := field.Interface().(time.Time)

return !fieldTime.Equal(t)
}

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return true
}
}

// default reflect.String:
Expand Down Expand Up @@ -869,18 +868,18 @@ func isLteCrossStructField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}
if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {

if fieldType == timeType {

fieldTime := field.Interface().(time.Time)
topTime := topField.Interface().(time.Time)
fieldTime := field.Convert(timeType).Interface().(time.Time)
topTime := topField.Convert(timeType).Interface().(time.Time)

return fieldTime.Before(topTime) || fieldTime.Equal(topTime)
}

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}
}

// default reflect.String:
Expand Down Expand Up @@ -917,18 +916,18 @@ func isLtCrossStructField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}

if fieldType == timeType {
if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {

fieldTime := field.Interface().(time.Time)
topTime := topField.Interface().(time.Time)
fieldTime := field.Convert(timeType).Interface().(time.Time)
topTime := topField.Convert(timeType).Interface().(time.Time)

return fieldTime.Before(topTime)
}

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}
}

// default reflect.String:
Expand Down Expand Up @@ -964,18 +963,18 @@ func isGteCrossStructField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}

if fieldType == timeType {
if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {

fieldTime := field.Interface().(time.Time)
topTime := topField.Interface().(time.Time)
fieldTime := field.Convert(timeType).Interface().(time.Time)
topTime := topField.Convert(timeType).Interface().(time.Time)

return fieldTime.After(topTime) || fieldTime.Equal(topTime)
}

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}
}

// default reflect.String:
Expand Down Expand Up @@ -1011,18 +1010,18 @@ func isGtCrossStructField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}
if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {

if fieldType == timeType {

fieldTime := field.Interface().(time.Time)
topTime := topField.Interface().(time.Time)
fieldTime := field.Convert(timeType).Interface().(time.Time)
topTime := topField.Convert(timeType).Interface().(time.Time)

return fieldTime.After(topTime)
}

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}
}

// default reflect.String:
Expand Down Expand Up @@ -1061,18 +1060,18 @@ func isNeCrossStructField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return true
}

if fieldType == timeType {
if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {

t := field.Interface().(time.Time)
fieldTime := topField.Interface().(time.Time)
t := field.Convert(timeType).Interface().(time.Time)
fieldTime := topField.Convert(timeType).Interface().(time.Time)

return !fieldTime.Equal(t)
}

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return true
}
}

// default reflect.String:
Expand Down Expand Up @@ -1111,18 +1110,18 @@ func isEqCrossStructField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}

if fieldType == timeType {
if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {

t := field.Interface().(time.Time)
fieldTime := topField.Interface().(time.Time)
t := field.Convert(timeType).Interface().(time.Time)
fieldTime := topField.Convert(timeType).Interface().(time.Time)

return fieldTime.Equal(t)
}

// Not Same underlying type i.e. struct and time
if fieldType != topField.Type() {
return false
}
}

// default reflect.String:
Expand Down Expand Up @@ -1161,19 +1160,18 @@ func isEqField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}
if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {

if fieldType == timeType {

t := currentField.Interface().(time.Time)
fieldTime := field.Interface().(time.Time)
t := currentField.Convert(timeType).Interface().(time.Time)
fieldTime := field.Convert(timeType).Interface().(time.Time)

return fieldTime.Equal(t)
}

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}
}

// default reflect.String:
Expand Down Expand Up @@ -1677,18 +1675,18 @@ func isGteField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}

if fieldType == timeType {
if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {

t := currentField.Interface().(time.Time)
fieldTime := field.Interface().(time.Time)
t := currentField.Convert(timeType).Interface().(time.Time)
fieldTime := field.Convert(timeType).Interface().(time.Time)

return fieldTime.After(t) || fieldTime.Equal(t)
}

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}
}

// default reflect.String
Expand Down Expand Up @@ -1724,18 +1722,18 @@ func isGtField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}

if fieldType == timeType {
if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {

t := currentField.Interface().(time.Time)
fieldTime := field.Interface().(time.Time)
t := currentField.Convert(timeType).Interface().(time.Time)
fieldTime := field.Convert(timeType).Interface().(time.Time)

return fieldTime.After(t)
}

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}
}

// default reflect.String
Expand Down Expand Up @@ -1777,10 +1775,10 @@ func isGte(fl FieldLevel) bool {

case reflect.Struct:

if field.Type() == timeType {
if field.Type().ConvertibleTo(timeType) {

now := time.Now().UTC()
t := field.Interface().(time.Time)
t := field.Convert(timeType).Interface().(time.Time)

return t.After(now) || t.Equal(now)
}
Expand Down Expand Up @@ -1823,9 +1821,9 @@ func isGt(fl FieldLevel) bool {
return field.Float() > p
case reflect.Struct:

if field.Type() == timeType {
if field.Type().ConvertibleTo(timeType) {

return field.Interface().(time.Time).After(time.Now().UTC())
return field.Convert(timeType).Interface().(time.Time).After(time.Now().UTC())
}
}

Expand Down Expand Up @@ -1903,18 +1901,18 @@ func isLteField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}
if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {

if fieldType == timeType {

t := currentField.Interface().(time.Time)
fieldTime := field.Interface().(time.Time)
t := currentField.Convert(timeType).Interface().(time.Time)
fieldTime := field.Convert(timeType).Interface().(time.Time)

return fieldTime.Before(t) || fieldTime.Equal(t)
}

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}
}

// default reflect.String
Expand Down Expand Up @@ -1950,18 +1948,18 @@ func isLtField(fl FieldLevel) bool {

fieldType := field.Type()

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}

if fieldType == timeType {
if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {

t := currentField.Interface().(time.Time)
fieldTime := field.Interface().(time.Time)
t := currentField.Convert(timeType).Interface().(time.Time)
fieldTime := field.Convert(timeType).Interface().(time.Time)

return fieldTime.Before(t)
}

// Not Same underlying type i.e. struct and time
if fieldType != currentField.Type() {
return false
}
}

// default reflect.String
Expand Down Expand Up @@ -2003,10 +2001,10 @@ func isLte(fl FieldLevel) bool {

case reflect.Struct:

if field.Type() == timeType {
if field.Type().ConvertibleTo(timeType) {

now := time.Now().UTC()
t := field.Interface().(time.Time)
t := field.Convert(timeType).Interface().(time.Time)

return t.Before(now) || t.Equal(now)
}
Expand Down Expand Up @@ -2050,9 +2048,9 @@ func isLt(fl FieldLevel) bool {

case reflect.Struct:

if field.Type() == timeType {
if field.Type().ConvertibleTo(timeType) {

return field.Interface().(time.Time).Before(time.Now().UTC())
return field.Convert(timeType).Interface().(time.Time).Before(time.Now().UTC())
}
}

Expand Down
2 changes: 1 addition & 1 deletion util.go
Expand Up @@ -82,7 +82,7 @@ BEGIN:
fld := namespace
var ns string

if typ != timeType {
if !typ.ConvertibleTo(timeType) {

idx := strings.Index(namespace, namespaceSeparator)

Expand Down
2 changes: 1 addition & 1 deletion validator.go
Expand Up @@ -164,7 +164,7 @@ func (v *validate) traverseField(ctx context.Context, parent reflect.Value, curr

typ = current.Type()

if typ != timeType {
if !typ.ConvertibleTo(timeType) {

if ct != nil {

Expand Down