Skip to content

Commit cd40f44

Browse files
authored
feat: transform carbon when validation bind request or struct (#542)
* feat: transform carbon when validation bind request * chancel the change of carbon/json.go * cancel
1 parent ac8d1e5 commit cd40f44

2 files changed

Lines changed: 690 additions & 43 deletions

File tree

validation/validator.go

Lines changed: 108 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/spf13/cast"
1010

1111
httpvalidate "github.com/goravel/framework/contracts/validation"
12+
"github.com/goravel/framework/support/carbon"
1213
)
1314

1415
func init() {
@@ -82,8 +83,11 @@ func (v *Validator) Fails() bool {
8283

8384
func (v *Validator) castValue() mapstructure.DecodeHookFunc {
8485
return func(from reflect.Value, to reflect.Value) (any, error) {
85-
var castedValue any
86-
var err error
86+
var (
87+
err error
88+
89+
castedValue = from.Interface()
90+
)
8791

8892
switch to.Kind() {
8993
case reflect.String:
@@ -138,6 +142,60 @@ func (v *Validator) castValue() mapstructure.DecodeHookFunc {
138142
default:
139143
castedValue, err = cast.ToStringMapE(from.Interface())
140144
}
145+
case reflect.Struct:
146+
switch to.Type() {
147+
case reflect.TypeOf(carbon.Carbon{}):
148+
castedValue = castCarbon(from, nil)
149+
case reflect.TypeOf(carbon.DateTime{}):
150+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
151+
return carbon.NewDateTime(c)
152+
})
153+
case reflect.TypeOf(carbon.DateTimeMilli{}):
154+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
155+
return carbon.NewDateTimeMilli(c)
156+
})
157+
case reflect.TypeOf(carbon.DateTimeMicro{}):
158+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
159+
return carbon.NewDateTimeMicro(c)
160+
})
161+
case reflect.TypeOf(carbon.DateTimeNano{}):
162+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
163+
return carbon.NewDateTimeNano(c)
164+
})
165+
case reflect.TypeOf(carbon.Date{}):
166+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
167+
return carbon.NewDate(c)
168+
})
169+
case reflect.TypeOf(carbon.DateMilli{}):
170+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
171+
return carbon.NewDateMilli(c)
172+
})
173+
case reflect.TypeOf(carbon.DateMicro{}):
174+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
175+
return carbon.NewDateMicro(c)
176+
})
177+
case reflect.TypeOf(carbon.DateNano{}):
178+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
179+
return carbon.NewDateNano(c)
180+
})
181+
case reflect.TypeOf(carbon.Timestamp{}):
182+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
183+
return carbon.NewTimestamp(c)
184+
})
185+
case reflect.TypeOf(carbon.TimestampMilli{}):
186+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
187+
return carbon.NewTimestampMilli(c)
188+
})
189+
case reflect.TypeOf(carbon.TimestampMicro{}):
190+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
191+
return carbon.NewTimestampMicro(c)
192+
})
193+
case reflect.TypeOf(carbon.TimestampNano{}):
194+
castedValue = castCarbon(from, func(c carbon.Carbon) any {
195+
return carbon.NewTimestampNano(c)
196+
})
197+
}
198+
141199
default:
142200
castedValue = from.Interface()
143201
}
@@ -150,3 +208,51 @@ func (v *Validator) castValue() mapstructure.DecodeHookFunc {
150208
return from.Interface(), nil
151209
}
152210
}
211+
212+
func castCarbon(from reflect.Value, transfrom func(carbon carbon.Carbon) any) any {
213+
var c carbon.Carbon
214+
215+
switch len(cast.ToString(from.Interface())) {
216+
case 10:
217+
fromInt64, err := cast.ToInt64E(from.Interface())
218+
if err != nil {
219+
c = carbon.Parse(cast.ToString(from.Interface()))
220+
}
221+
if fromInt64 > 0 {
222+
c = carbon.FromTimestamp(fromInt64)
223+
}
224+
case 13:
225+
fromInt64, err := cast.ToInt64E(from.Interface())
226+
if err != nil {
227+
c = carbon.ParseByFormat(cast.ToString(from.Interface()), "Y-m-d H")
228+
}
229+
if fromInt64 > 0 {
230+
c = carbon.FromTimestampMilli(fromInt64)
231+
}
232+
case 16:
233+
fromInt64, err := cast.ToInt64E(from.Interface())
234+
if err != nil {
235+
c = carbon.ParseByFormat(cast.ToString(from.Interface()), "Y-m-d H:i")
236+
}
237+
if fromInt64 > 0 {
238+
c = carbon.FromTimestampMicro(fromInt64)
239+
}
240+
case 19:
241+
fromInt64, err := cast.ToInt64E(from.Interface())
242+
if err != nil {
243+
c = carbon.Parse(cast.ToString(from.Interface()))
244+
}
245+
246+
if fromInt64 > 0 {
247+
c = carbon.FromTimestampNano(fromInt64)
248+
}
249+
default:
250+
c = carbon.Parse(cast.ToString(from.Interface()))
251+
}
252+
253+
if transfrom != nil {
254+
return transfrom(c)
255+
}
256+
257+
return c
258+
}

0 commit comments

Comments
 (0)