func createMetricStreamVariables()

in dev/import-beats/variables.go [42:105]


func createMetricStreamVariables(configFileContent []byte, moduleName, dataStreamName string) ([]packages.Variable, error) {
	var vars []packages.Variable
	if len(configFileContent) == 0 {
		return vars, nil
	}

	var moduleConfig []mapStr
	err := yaml.Unmarshal(configFileContent, &moduleConfig)
	if err != nil {
		return nil, errors.Wrap(err, "unmarshalling module config failed")
	}

	foundConfigEntries := map[string]bool{}

	for _, moduleConfigEntry := range moduleConfig {
		flatEntry := moduleConfigEntry.flatten()
		related, err := isConfigEntryRelatedToMetricset(flatEntry, dataStreamName)
		if err != nil {
			return nil, errors.Wrapf(err, "checking if config entry is related failed")
		}

		for name, value := range flatEntry {
			if shouldConfigOptionBeIgnored(name, value) {
				continue
			}

			if _, ok := foundConfigEntries[name]; ok {
				continue // already processed this config option
			}

			if related || strings.HasPrefix(name, fmt.Sprintf("%s.", dataStreamName)) {
				var isArray bool
				variableType := determineInputVariableType(name, value)
				if variableType == "yaml" {
					m, err := yaml.Marshal(value)
					if err != nil {
						return nil, errors.Wrapf(err, "marshalling object configuration variable failed")
					}
					value = string(m)
				} else {
					_, isArray = value.([]interface{})
				}
				aVar := packages.Variable{
					Name:     name,
					Type:     variableType,
					Title:    toVariableTitle(name),
					Multi:    isArray,
					Required: determineInputVariableIsRequired(value),
					ShowUser: true,
					Default:  value,
				}

				vars = append(vars, aVar)
				foundConfigEntries[name] = true
			}
		}
	}

	// sort variables to keep them in order while using version control.
	sort.Slice(vars, func(i, j int) bool {
		return sort.StringsAreSorted([]string{vars[i].Name, vars[j].Name})
	})
	return vars, nil
}