in pkg/genlib/generator_interface.go [1118:1232]
func bindDoubleWithReturn(fieldCfg ConfigField, field Field, fieldMap map[string]any) error {
if err := fieldCfg.ValidCounter(); err != nil {
return err
}
if err := fieldCfg.ValidateCounterResetStrategy(); err != nil {
return err
}
if err := fieldCfg.ValidateCounterResetAfterN(); err != nil {
return err
}
if err := fieldCfg.ValidateCounterResetProbabilistic(); err != nil {
return err
}
if len(fieldCfg.Enum) > 0 {
var emitF emitF
idx := customRand.Intn(len(fieldCfg.Enum))
f, err := strconv.ParseFloat(fieldCfg.Enum[idx], 64)
if err != nil {
return fmt.Errorf("field %s enum value is not a double: %w", fieldCfg.Name, err)
}
emitF = func(state *genState) any {
return f
}
fieldMap[field.Name] = emitF
return nil
}
if fieldCfg.Counter {
var emitF emitF
emitF = func(state *genState) any {
previous := float64(1)
var dummyFloat float64
var dummyFunc func() float64
if previousDummyFloat, ok := state.prevCache[field.Name].(float64); ok {
previous = previousDummyFloat
}
if fieldCfg.Fuzziness <= 0 {
dummyFunc = makeFloatCounterFunc(previous, field)
dummyFloat = dummyFunc()
} else {
dummyFloat = fuzzyFloatCounter(previous, fieldCfg.Fuzziness)
}
if fieldCfg.CounterReset != nil {
switch fieldCfg.CounterReset.Strategy {
case config.CounterResetStrategyRandom:
// 50% chance to reset
if customRand.Intn(2) == 0 {
dummyFloat = 0
}
case config.CounterResetStrategyProbabilistic:
// Probability% chance to reset
if customRand.Intn(100) < int(*fieldCfg.CounterReset.Probability) {
dummyFloat = 0
}
case config.CounterResetStrategyAfterN:
// Reset after N
if state.counter%*fieldCfg.CounterReset.ResetAfterN == 0 {
dummyFloat = 0
}
}
}
state.prevCache[field.Name] = dummyFloat
return dummyFloat
}
fieldMap[field.Name] = emitF
return nil
}
dummyFunc := makeFloatFunc(fieldCfg, field)
if fieldCfg.Fuzziness <= 0 {
var emitF emitF
emitF = func(state *genState) any {
return dummyFunc()
}
fieldMap[field.Name] = emitF
return nil
}
min, _ := fieldCfg.Range.MinAsFloat64()
max, _ := fieldCfg.Range.MaxAsFloat64()
var emitF emitF
emitF = func(state *genState) any {
var dummyFloat float64
if previousDummyFloat, ok := state.prevCache[field.Name].(float64); ok {
dummyFloat = fuzzyFloat(previousDummyFloat, fieldCfg.Fuzziness, min, max)
} else {
dummyFloat = dummyFunc()
}
state.prevCache[field.Name] = dummyFloat
return dummyFloat
}
fieldMap[field.Name] = emitF
return nil
}