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
}