@@ -77,7 +77,7 @@ func parseRead(f io.Reader, decoder unmarshaller, cfg any) error {
7777func defaultsAndRequired (cfg any ) error {
7878 reqs := defsAndReqs (cfg )
7979 if len (reqs ) > 0 {
80- return fmt .Errorf ("required config parameters not set: %s" , strings .Join (reqs , ", " ))
80+ return fmt .Errorf ("required config parameters not set: %s" , strings .Join (reqs , ", " )) //nolint:err113
8181 }
8282 return nil
8383}
@@ -87,12 +87,12 @@ func defsAndReqs(cfg any) []string {
8787 val := reflect .ValueOf (cfg ).Elem ()
8888 typ := val .Type ()
8989
90- for i := 0 ; i < val .NumField (); i ++ {
90+ for i := range val .NumField () {
9191 field := val .Field (i )
9292 fieldType := typ .Field (i )
9393
9494 // Set the default value based on the field kind
95- if field .Kind () == reflect .Struct {
95+ if field .Kind () == reflect .Struct { //nolint:nestif
9696 // If it's a struct, recurse
9797 reqs = append (reqs , defsAndReqs (field .Addr ().Interface ())... )
9898 } else if field .CanSet () {
@@ -101,11 +101,7 @@ func defsAndReqs(cfg any) []string {
101101 continue
102102 }
103103 // Check if the field has a `required` tag
104- isRequired := false
105- required , ok := fieldType .Tag .Lookup ("required" )
106- if ok && required == "true" {
107- isRequired = true
108- }
104+ isRequired := isFieldRequired (fieldType )
109105 // Check if the field has a `default` tag
110106 defaultValue , hasDefault := fieldType .Tag .Lookup ("default" )
111107 if ! hasDefault {
@@ -115,41 +111,20 @@ func defsAndReqs(cfg any) []string {
115111 continue
116112 }
117113
118- switch field .Kind () {
119- case reflect .String :
120- field .SetString (defaultValue )
121- case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
122- intValue , err := strconv .ParseInt (defaultValue , 10 , 64 )
123- if err != nil {
124- errSyntax := strconv .ErrSyntax
125- if errors .Is (err , errSyntax ) {
126- dur , err := time .ParseDuration (defaultValue )
127- if err == nil {
128- field .SetInt (int64 (dur ))
129- }
130- }
131- } else {
132- field .SetInt (intValue )
133- }
134-
135- case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 :
136- if uintValue , err := strconv .ParseUint (defaultValue , 10 , 64 ); err == nil {
137- field .SetUint (uintValue )
138- }
139- case reflect .Float32 , reflect .Float64 :
140- if floatValue , err := strconv .ParseFloat (defaultValue , 64 ); err == nil {
141- field .SetFloat (floatValue )
142- }
143- case reflect .Bool :
144- if boolValue , err := strconv .ParseBool (defaultValue ); err == nil {
145- field .SetBool (boolValue )
146- }
147- }
114+ setField (field , defaultValue )
148115 }
149116 }
150117 return reqs
151118}
152119
120+ func isFieldRequired (field reflect.StructField ) bool {
121+ required , ok := field .Tag .Lookup ("required" )
122+ if ok && required == "true" {
123+ return true
124+ }
125+ return false
126+ }
127+
153128func isFieldEmpty (v reflect.Value ) bool {
154129 switch v .Kind () {
155130 case reflect .Slice :
@@ -163,3 +138,36 @@ func isFieldEmpty(v reflect.Value) bool {
163138 return v .Interface () == reflect .Zero (v .Type ()).Interface ()
164139 }
165140}
141+
142+ func setField (field reflect.Value , defaultValue string ) {
143+ switch field .Kind () {
144+ case reflect .String :
145+ field .SetString (defaultValue )
146+ case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
147+ intValue , err := strconv .ParseInt (defaultValue , 10 , 64 )
148+ if err != nil {
149+ errSyntax := strconv .ErrSyntax
150+ if errors .Is (err , errSyntax ) {
151+ dur , err := time .ParseDuration (defaultValue )
152+ if err == nil {
153+ field .SetInt (int64 (dur ))
154+ }
155+ }
156+ } else {
157+ field .SetInt (intValue )
158+ }
159+
160+ case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 :
161+ if uintValue , err := strconv .ParseUint (defaultValue , 10 , 64 ); err == nil {
162+ field .SetUint (uintValue )
163+ }
164+ case reflect .Float32 , reflect .Float64 :
165+ if floatValue , err := strconv .ParseFloat (defaultValue , 64 ); err == nil {
166+ field .SetFloat (floatValue )
167+ }
168+ case reflect .Bool :
169+ if boolValue , err := strconv .ParseBool (defaultValue ); err == nil {
170+ field .SetBool (boolValue )
171+ }
172+ }
173+ }
0 commit comments