@@ -74,28 +74,28 @@ type settingsFieldUpdater func(form url.Values, settings *mvServiceRuntimeSettin
7474
7575// mvServiceSettingsFieldUpdaters defines how each form field is parsed, validated, and applied.
7676var mvServiceSettingsFieldUpdaters = []settingsFieldUpdater {
77- newSettingsFieldUpdater (mvServiceTaskMaxConcurrencyFormField , strconv . Atoi , func (v int ) bool { return v > 0 }, func (settings * mvServiceRuntimeSettings , v int ) {
77+ newIntSettingsFieldUpdater (mvServiceTaskMaxConcurrencyFormField , func (v int ) bool { return v > 0 }, func (settings * mvServiceRuntimeSettings , v int ) {
7878 settings .maxConcurrency = v
7979 }),
80- newSettingsFieldUpdater (mvServiceTaskTimeoutFormField , time . ParseDuration , func (v time.Duration ) bool { return v >= 0 }, func (settings * mvServiceRuntimeSettings , v time.Duration ) {
80+ newDurationSettingsFieldUpdater (mvServiceTaskTimeoutFormField , func (v time.Duration ) bool { return v >= 0 }, func (settings * mvServiceRuntimeSettings , v time.Duration ) {
8181 settings .timeout = v
8282 }),
83- newSettingsFieldUpdater (mvServiceBackpressureEnabledFormField , strconv . ParseBool , nil , func (settings * mvServiceRuntimeSettings , v bool ) {
83+ newBoolSettingsFieldUpdater (mvServiceBackpressureEnabledFormField , nil , func (settings * mvServiceRuntimeSettings , v bool ) {
8484 settings .backpressureCfg .Enabled = v
8585 }),
86- newSettingsFieldUpdater (mvServiceBackpressureCPUThresholdFormField , parseFloat64FieldValue , nil , func (settings * mvServiceRuntimeSettings , v float64 ) {
86+ newFloat64SettingsFieldUpdater (mvServiceBackpressureCPUThresholdFormField , nil , func (settings * mvServiceRuntimeSettings , v float64 ) {
8787 settings .backpressureCfg .CPUThreshold = v
8888 }),
89- newSettingsFieldUpdater (mvServiceBackpressureMemThresholdFormField , parseFloat64FieldValue , nil , func (settings * mvServiceRuntimeSettings , v float64 ) {
89+ newFloat64SettingsFieldUpdater (mvServiceBackpressureMemThresholdFormField , nil , func (settings * mvServiceRuntimeSettings , v float64 ) {
9090 settings .backpressureCfg .MemThreshold = v
9191 }),
92- newSettingsFieldUpdater (mvServiceBackpressureDelayFormField , time . ParseDuration , nil , func (settings * mvServiceRuntimeSettings , v time.Duration ) {
92+ newDurationSettingsFieldUpdater (mvServiceBackpressureDelayFormField , nil , func (settings * mvServiceRuntimeSettings , v time.Duration ) {
9393 settings .backpressureCfg .Delay = v
9494 }),
95- newSettingsFieldUpdater (mvServiceTaskFailRetryBaseDelayFormField , time . ParseDuration , nil , func (settings * mvServiceRuntimeSettings , v time.Duration ) {
95+ newDurationSettingsFieldUpdater (mvServiceTaskFailRetryBaseDelayFormField , nil , func (settings * mvServiceRuntimeSettings , v time.Duration ) {
9696 settings .retryBase = v
9797 }),
98- newSettingsFieldUpdater (mvServiceTaskFailRetryMaxDelayFormField , time . ParseDuration , nil , func (settings * mvServiceRuntimeSettings , v time.Duration ) {
98+ newDurationSettingsFieldUpdater (mvServiceTaskFailRetryMaxDelayFormField , nil , func (settings * mvServiceRuntimeSettings , v time.Duration ) {
9999 settings .retryMax = v
100100 }),
101101}
@@ -229,21 +229,42 @@ func parseMVServiceSettingsUpdateFromForm(form url.Values, current mvServiceRunt
229229 return updated , changed , nil
230230}
231231
232- // newSettingsFieldUpdater builds a reusable updater for one form field.
233- func newSettingsFieldUpdater [T any ](
232+ func newIntSettingsFieldUpdater (
234233 field string ,
235- parse func (string ) (T , error ),
236- validate func (T ) bool ,
237- assign func (settings * mvServiceRuntimeSettings , value T ),
234+ validate func (int ) bool ,
235+ assign func (settings * mvServiceRuntimeSettings , value int ),
238236) settingsFieldUpdater {
239237 return func (form url.Values , settings * mvServiceRuntimeSettings ) (changed bool , err error ) {
240- value , ok , err := parseOptionalFieldValue (form , field , parse )
238+ text , ok := parseOptionalFieldText (form , field )
239+ if ! ok {
240+ return false , nil
241+ }
242+ value , err := strconv .Atoi (text )
241243 if err != nil {
242- return false , err
244+ return false , newIllegalMVServiceSettingsFieldError (field )
245+ }
246+ if validate != nil && ! validate (value ) {
247+ return false , newIllegalMVServiceSettingsFieldError (field )
243248 }
249+ assign (settings , value )
250+ return true , nil
251+ }
252+ }
253+
254+ func newDurationSettingsFieldUpdater (
255+ field string ,
256+ validate func (time.Duration ) bool ,
257+ assign func (settings * mvServiceRuntimeSettings , value time.Duration ),
258+ ) settingsFieldUpdater {
259+ return func (form url.Values , settings * mvServiceRuntimeSettings ) (changed bool , err error ) {
260+ text , ok := parseOptionalFieldText (form , field )
244261 if ! ok {
245262 return false , nil
246263 }
264+ value , err := time .ParseDuration (text )
265+ if err != nil {
266+ return false , newIllegalMVServiceSettingsFieldError (field )
267+ }
247268 if validate != nil && ! validate (value ) {
248269 return false , newIllegalMVServiceSettingsFieldError (field )
249270 }
@@ -252,22 +273,57 @@ func newSettingsFieldUpdater[T any](
252273 }
253274}
254275
255- // parseOptionalFieldValue parses a field only when it is provided.
256- func parseOptionalFieldValue [T any ](form url.Values , field string , parse func (string ) (T , error )) (value T , ok bool , err error ) {
257- text := form .Get (field )
258- if text == "" {
259- return value , false , nil
276+ func newBoolSettingsFieldUpdater (
277+ field string ,
278+ validate func (bool ) bool ,
279+ assign func (settings * mvServiceRuntimeSettings , value bool ),
280+ ) settingsFieldUpdater {
281+ return func (form url.Values , settings * mvServiceRuntimeSettings ) (changed bool , err error ) {
282+ text , ok := parseOptionalFieldText (form , field )
283+ if ! ok {
284+ return false , nil
285+ }
286+ value , err := strconv .ParseBool (text )
287+ if err != nil {
288+ return false , newIllegalMVServiceSettingsFieldError (field )
289+ }
290+ if validate != nil && ! validate (value ) {
291+ return false , newIllegalMVServiceSettingsFieldError (field )
292+ }
293+ assign (settings , value )
294+ return true , nil
260295 }
261- value , err = parse (text )
262- if err != nil {
263- return value , false , newIllegalMVServiceSettingsFieldError (field )
296+ }
297+
298+ func newFloat64SettingsFieldUpdater (
299+ field string ,
300+ validate func (float64 ) bool ,
301+ assign func (settings * mvServiceRuntimeSettings , value float64 ),
302+ ) settingsFieldUpdater {
303+ return func (form url.Values , settings * mvServiceRuntimeSettings ) (changed bool , err error ) {
304+ text , ok := parseOptionalFieldText (form , field )
305+ if ! ok {
306+ return false , nil
307+ }
308+ value , err := strconv .ParseFloat (text , 64 )
309+ if err != nil {
310+ return false , newIllegalMVServiceSettingsFieldError (field )
311+ }
312+ if validate != nil && ! validate (value ) {
313+ return false , newIllegalMVServiceSettingsFieldError (field )
314+ }
315+ assign (settings , value )
316+ return true , nil
264317 }
265- return value , true , nil
266318}
267319
268- // parseFloat64FieldValue parses a float64 from text.
269- func parseFloat64FieldValue (text string ) (float64 , error ) {
270- return strconv .ParseFloat (text , 64 )
320+ // parseOptionalFieldText returns the field text only when it is provided.
321+ func parseOptionalFieldText (form url.Values , field string ) (text string , ok bool ) {
322+ text = form .Get (field )
323+ if text == "" {
324+ return "" , false
325+ }
326+ return text , true
271327}
272328
273329// newIllegalMVServiceSettingsFieldError builds a uniform field validation error.
0 commit comments