func bindCardinality()

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
}