@@ -23,115 +23,121 @@ func defaultValue(ctx context.Context, fl mold.FieldLevel) error {
2323 return setValue (ctx , fl )
2424}
2525
26+ func setValue (_ context.Context , fl mold.FieldLevel ) error {
27+ return setValueInner (fl .Field (), fl .Param ())
28+ }
29+
2630// setValue allows setting of a specified value
27- func setValue ( ctx context. Context , fl mold. FieldLevel ) error {
28- switch fl . Field () .Kind () {
31+ func setValueInner ( field reflect. Value , param string ) error {
32+ switch field .Kind () {
2933 case reflect .String :
30- fl . Field (). SetString (fl . Param () )
34+ field . SetString (param )
3135
3236 case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 :
33- value , err := strconv .Atoi (fl . Param () )
37+ value , err := strconv .Atoi (param )
3438 if err != nil {
3539 return err
3640 }
37- fl . Field () .SetInt (int64 (value ))
41+ field .SetInt (int64 (value ))
3842
3943 case reflect .Int64 :
4044 var value int64
4145
42- if fl . Field () .Type () == durationType {
43- d , err := time .ParseDuration (fl . Param () )
46+ if field .Type () == durationType {
47+ d , err := time .ParseDuration (param )
4448 if err != nil {
4549 return err
4650 }
4751 value = int64 (d )
4852 } else {
49- i , err := strconv .Atoi (fl . Param () )
53+ i , err := strconv .Atoi (param )
5054 if err != nil {
5155 return err
5256 }
5357 value = int64 (i )
5458 }
55- fl . Field () .SetInt (value )
59+ field .SetInt (value )
5660
5761 case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 :
58- value , err := strconv .Atoi (fl . Param () )
62+ value , err := strconv .Atoi (param )
5963 if err != nil {
6064 return err
6165 }
62- fl . Field () .SetUint (uint64 (value ))
66+ field .SetUint (uint64 (value ))
6367
6468 case reflect .Float32 , reflect .Float64 :
65- value , err := strconv .ParseFloat (fl . Param () , 64 )
69+ value , err := strconv .ParseFloat (param , 64 )
6670 if err != nil {
6771 return err
6872 }
69- fl . Field () .SetFloat (value )
73+ field .SetFloat (value )
7074
7175 case reflect .Bool :
72- value , err := strconv .ParseBool (fl . Param () )
76+ value , err := strconv .ParseBool (param )
7377 if err != nil {
7478 return err
7579 }
76- fl . Field () .SetBool (value )
80+ field .SetBool (value )
7781
7882 case reflect .Map :
7983 var n int
8084 var err error
81- if fl . Param () != "" {
82- n , err = strconv .Atoi (fl . Param () )
85+ if param != "" {
86+ n , err = strconv .Atoi (param )
8387 if err != nil {
8488 return err
8589 }
8690 }
87- fl . Field (). Set (reflect .MakeMapWithSize (fl . Field () .Type (), n ))
91+ field . Set (reflect .MakeMapWithSize (field .Type (), n ))
8892
8993 case reflect .Slice :
9094 var cap int
9195 var err error
92- if fl . Param () != "" {
93- cap , err = strconv .Atoi (fl . Param () )
96+ if param != "" {
97+ cap , err = strconv .Atoi (param )
9498 if err != nil {
9599 return err
96100 }
97101 }
98- fl . Field (). Set (reflect .MakeSlice (fl . Field () .Type (), 0 , cap ))
102+ field . Set (reflect .MakeSlice (field .Type (), 0 , cap ))
99103
100104 case reflect .Struct :
101- if fl . Field () .Type () == timeType {
102- if fl . Param () != "" {
103- if strings .ToLower (fl . Param () ) == "utc" {
104- fl . Field () .Set (reflect .ValueOf (time .Now ().UTC ()))
105+ if field .Type () == timeType {
106+ if param != "" {
107+ if strings .ToLower (param ) == "utc" {
108+ field .Set (reflect .ValueOf (time .Now ().UTC ()))
105109 } else {
106- t , err := time .Parse (time .RFC3339Nano , fl . Param () )
110+ t , err := time .Parse (time .RFC3339Nano , param )
107111 if err != nil {
108112 return err
109113 }
110- fl . Field () .Set (reflect .ValueOf (t ))
114+ field .Set (reflect .ValueOf (t ))
111115 }
112116 } else {
113- fl . Field () .Set (reflect .ValueOf (time .Now ()))
117+ field .Set (reflect .ValueOf (time .Now ()))
114118 }
115119 }
116120 case reflect .Chan :
117121 var buffer int
118122 var err error
119- if fl . Param () != "" {
120- buffer , err = strconv .Atoi (fl . Param () )
123+ if param != "" {
124+ buffer , err = strconv .Atoi (param )
121125 if err != nil {
122126 return err
123127 }
124128 }
125- fl . Field (). Set (reflect .MakeChan (fl . Field () .Type (), buffer ))
129+ field . Set (reflect .MakeChan (field .Type (), buffer ))
126130
127131 case reflect .Ptr :
128- fl .Field ().Set (reflect .New (fl .Field ().Type ().Elem ()))
132+
133+ field .Set (reflect .New (field .Type ().Elem ()))
134+ return setValueInner (field .Elem (), param )
129135 }
130136 return nil
131137}
132138
133139// empty sets the field to the zero value of the field type
134- func empty (ctx context.Context , fl mold.FieldLevel ) error {
140+ func empty (_ context.Context , fl mold.FieldLevel ) error {
135141 zeroValue := reflect .Zero (fl .Field ().Type ())
136142 fl .Field ().Set (zeroValue )
137143 return nil
0 commit comments