func generateTemplateFromField()

in pkg/genlib/generator.go [64:166]


func generateTemplateFromField(cfg Config, fields Fields, templateEngine int) ([]byte, []Field) {
	if len(fields) == 0 {
		return nil, nil
	}

	dupes := make(map[string]struct{})
	objectKeysField := make([]Field, 0, len(fields))

	templatePrefix := "{ "
	templateBuffer := bytes.NewBufferString(templatePrefix)
	for i, field := range fields {
		fieldWrap := fieldValueWrapByType(field)
		if fieldCfg, ok := cfg.GetField(field.Name); ok {
			if fieldCfg.Value != nil {
				fieldWrap = ""
			}
		}

		fieldTrailer := []byte(",")
		if i == len(fields)-1 {
			fieldTrailer = []byte(" }")
		}

		if strings.HasSuffix(field.Name, ".*") || field.Type == FieldTypeObject || field.Type == FieldTypeNested || field.Type == FieldTypeFlattened {
			// This is a special case.  We are randomly generating keys on the fly
			// Will set the json field name as "field.Name.N"
			N := 5
			for ii := 0; ii < N; ii++ {
				// Fire or skip
				if rand.Int()%2 == 0 {
					continue
				}

				if string(fieldTrailer) == "}" && ii < N-1 {
					fieldTrailer = []byte(",")
				}

				var try int
				const maxTries = 10
				rNoun := randomdata.Noun()
				_, ok := dupes[rNoun]
				for ; ok && try < maxTries; try++ {
					rNoun = randomdata.Noun()
					_, ok = dupes[rNoun]
				}

				// If all else fails, use a shortuuid.
				// Try to avoid this as it is alloc expensive
				if try >= maxTries {
					rNoun = shortuuid.New()
				}

				dupes[rNoun] = struct{}{}
				var fieldTemplate string

				fieldNameRoot := replacer.Replace(field.Name)
				fieldVariableName := fieldNormalizerRegex.ReplaceAllString(fmt.Sprintf("%s%s", fieldNameRoot, rNoun), "")
				fieldVariableName += "Var"
				if field.Type == FieldTypeDate {
					if templateEngine == textTemplateEngine {
						fieldTemplate = fmt.Sprintf(`{{ $%s := generate "%s.%s" }}"%s.%s": %s{{$%s.Format "2006-01-02T15:04:05.999999999Z07:00"}}%s%s`, fieldVariableName, fieldNameRoot, rNoun, fieldNameRoot, rNoun, fieldWrap, fieldVariableName, fieldWrap, fieldTrailer)
					} else if templateEngine == customTemplateEngine {
						fieldTemplate = fmt.Sprintf(`"%s.%s": %s{{.%s.%s}}%s%s`, fieldNameRoot, rNoun, fieldWrap, fieldNameRoot, rNoun, fieldWrap, fieldTrailer)
					}
				} else {
					if templateEngine == textTemplateEngine {
						fieldTemplate = fmt.Sprintf(`"%s.%s": %s{{generate "%s.%s"}}%s%s`, fieldNameRoot, rNoun, fieldWrap, fieldNameRoot, rNoun, fieldWrap, fieldTrailer)
					} else if templateEngine == customTemplateEngine {
						fieldTemplate = fmt.Sprintf(`"%s.%s": %s{{.%s.%s}}%s%s`, fieldNameRoot, rNoun, fieldWrap, fieldNameRoot, rNoun, fieldWrap, fieldTrailer)
					}
				}

				originalFieldName := field.Name
				field.Name = fieldNameRoot + "." + rNoun
				objectKeysField = append(objectKeysField, field)
				field.Name = originalFieldName

				templateBuffer.WriteString(fieldTemplate)
			}
		} else {
			var fieldTemplate string
			fieldVariableName := fieldNormalizerRegex.ReplaceAllString(field.Name, "")
			fieldVariableName += "Var"
			if field.Type == FieldTypeDate {
				if templateEngine == textTemplateEngine {
					fieldTemplate = fmt.Sprintf(`{{ $%s := generate "%s" }}"%s": %s{{$%s.Format "2006-01-02T15:04:05.999999999Z07:00"}}%s%s`, fieldVariableName, field.Name, field.Name, fieldWrap, fieldVariableName, fieldWrap, fieldTrailer)
				} else if templateEngine == customTemplateEngine {
					fieldTemplate = fmt.Sprintf(`"%s": %s{{.%s}}%s%s`, field.Name, fieldWrap, field.Name, fieldWrap, fieldTrailer)
				}
			} else {
				if templateEngine == textTemplateEngine {
					fieldTemplate = fmt.Sprintf(`"%s": %s{{generate "%s"}}%s%s`, field.Name, fieldWrap, field.Name, fieldWrap, fieldTrailer)
				} else if templateEngine == customTemplateEngine {
					fieldTemplate = fmt.Sprintf(`"%s": %s{{.%s}}%s%s`, field.Name, fieldWrap, field.Name, fieldWrap, fieldTrailer)
				}
			}

			templateBuffer.WriteString(fieldTemplate)
		}
	}

	return templateBuffer.Bytes(), objectKeysField
}