func bindCardinalityWithReturn()

in pkg/genlib/generator_interface.go [1234:1284]


func bindCardinalityWithReturn(cfg Config, field Field, fieldMap map[string]any) error {

	fieldCfg, _ := cfg.GetField(field.Name)
	cardinality := fieldCfg.Cardinality

	if strings.HasSuffix(field.Name, ".*") {
		field.Name = replacer.Replace(field.Name)
	}

	// Go ahead and bind the original field
	if err := bindByTypeWithReturn(cfg, field, fieldMap); err != nil {
		return err
	}

	// We will wrap the function we just generated
	boundFWithReturn := fieldMap[field.Name].(emitF)
	var emitF emitF
	emitF = func(state *genState) any {
		var value any
		// Have we rolled over once?  If not, generate a value and cache it.
		if len(state.prevCacheCardinality[field.Name]) < cardinality {
			// Do college try dupe detection on value;
			// Allow dupe if no unique value in nTries.
			nTries := 11 // "These go to 11."
			for i := 0; i < nTries; i++ {
				value = boundFWithReturn(state)

				if !isDupeAny(state.prevCacheForDup[field.Name], value) {
					break
				}
			}

			state.prevCacheForDup[field.Name][value] = struct{}{}
			state.prevCacheCardinality[field.Name] = append(state.prevCacheCardinality[field.Name], value)
		}

		idx := int(state.counter % uint64(cardinality))

		// Safety check; should be a noop
		if idx >= len(state.prevCacheCardinality[field.Name]) {
			idx = len(state.prevCacheCardinality[field.Name]) - 1
		}

		choice := state.prevCacheCardinality[field.Name][idx]

		return choice
	}

	fieldMap[field.Name] = emitF
	return nil
}