99 "github.com/spf13/cast"
1010
1111 httpvalidate "github.com/goravel/framework/contracts/validation"
12+ "github.com/goravel/framework/support/carbon"
1213)
1314
1415func init () {
@@ -82,8 +83,11 @@ func (v *Validator) Fails() bool {
8283
8384func (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