in pkg/genlib/generator_interface.go [735:796]
func bindCardinality(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 := bindByType(cfg, field, fieldMap); err != nil {
return err
}
// We will wrap the function we just generated
boundF, ok := fieldMap[field.Name].(emitFNotReturn)
if !ok {
return errors.New("cannot bind cardinality")
}
var emitFNotReturn emitFNotReturn
emitFNotReturn = func(state *genState, buf *bytes.Buffer) error {
// 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."
var tmp bytes.Buffer
var value []byte
for i := 0; i < nTries; i++ {
tmp.Reset()
if err := boundF(state, &tmp); err != nil {
return err
}
value = tmp.Bytes()
if !isDupeAny(state.prevCacheForDup[field.Name], string(value)) {
break
}
}
state.prevCacheForDup[field.Name][string(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].([]byte)
buf.Write(choice)
return nil
}
fieldMap[field.Name] = emitFNotReturn
return nil
}