func bindLongWithReturn()

in pkg/genlib/generator_interface.go [967:1082]


func bindLongWithReturn(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.ParseInt(fieldCfg.Enum[idx], 10, 64)
		if err != nil {
			return fmt.Errorf("field %s enum value is not a long: %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 := int64(1)
			var dummyInt int64
			var dummyFunc func() int64

			if previousDummyInt, ok := state.prevCache[field.Name].(int64); ok {
				previous = previousDummyInt
			}

			if fieldCfg.Fuzziness <= 0 {
				dummyFunc = makeIntCounterFunc(previous, field)

				dummyInt = dummyFunc()
			} else {
				dummyInt = fuzzyIntCounter(previous, fieldCfg.Fuzziness)
			}

			if fieldCfg.CounterReset != nil {
				switch fieldCfg.CounterReset.Strategy {
				case config.CounterResetStrategyRandom:
					// 50% chance to reset
					if customRand.Intn(2) == 0 {
						dummyInt = 0
					}
				case config.CounterResetStrategyProbabilistic:
					// Probability% chance to reset
					if customRand.Intn(100) < int(*fieldCfg.CounterReset.Probability) {
						dummyInt = 0
					}
				case config.CounterResetStrategyAfterN:
					// Reset after N
					if state.counter%*fieldCfg.CounterReset.ResetAfterN == 0 {
						dummyInt = 0
					}
				}
			}

			state.prevCache[field.Name] = dummyInt
			return dummyInt
		}

		fieldMap[field.Name] = emitF

		return nil
	}

	dummyFunc := makeIntFunc(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 dummyInt int64
		if previousDummyInt, ok := state.prevCache[field.Name].(int64); ok {
			if previousDummyInt == 0 {
				previousDummyInt = 1
			}
			dummyInt = fuzzyInt(previousDummyInt, fieldCfg.Fuzziness, min, max)
		} else {
			dummyInt = dummyFunc()
		}
		state.prevCache[field.Name] = dummyInt
		return dummyInt
	}

	fieldMap[field.Name] = emitF
	return nil
}