func OverwriteMetadata()

in mpdev/internal/tf/overwrite.go [274:348]


func OverwriteMetadata(config *overwriteConfig, dir string) error {
	data, err := os.ReadFile(path.Join(dir, metadataFile))
	if err != nil {
		// CLI only modules will not have a metadata file. Ignore file not found errors
		if os.IsNotExist(err) {
			return nil
		}
		return err
	}

	json, err := yaml.YAMLToJSON(data)
	if err != nil {
		return fmt.Errorf("failure parsing %s error: %w", metadataFile, err)
	}

	if config.NewValues != nil {
		fmt.Printf("Replacing the default values of the variables: %s in %s\n",
			config.NewValues, metadataFile)

		for varName, newValue := range config.NewValues {
			varQuery := fmt.Sprintf(`spec.interfaces.variables.#(name=="%s")`, varName)
			varEntry := gjson.GetBytes(json, varQuery)
			if varEntry.Raw == "" {
				return fmt.Errorf("missing variable entry for variable: %s in %s",
					varName, metadataFile)
			}
			// sjson.SetBytes doesn't work when spec.interfaces.variables.#(name=="%s").defaultValue
			// doesn't already exist. Retrieving and setting the whole variable entry
			// as a workaround.
			varEntryMap := varEntry.Value().(map[string]interface{})
			varEntryMap["defaultValue"] = newValue
			json, err = sjson.SetBytes(json, varQuery, varEntryMap)
			if err != nil {
				return fmt.Errorf("error setting the updated entry for variable: %s. error: %w",
					varName, err)
			}
		}
	} else {
		fmt.Printf("Replacing the default values of the variables: %s in %s\n",
			config.Variables, metadataFile)

		for _, variable := range config.Variables {
			query := fmt.Sprintf(`spec.interfaces.variables.#(name=="%s").defaultValue`, variable)
			defaultVal := gjson.GetBytes(json, query).String()
			if defaultVal == "" {
				return fmt.Errorf("Missing valid default value for variable: %s in %s",
					variable, metadataFile)
			}
			replaceVal, ok := config.Replacements[defaultVal]
			if !ok {
				return fmt.Errorf("default value: %s of variable: %s in %s not found"+
					" in replacements", defaultVal, variable, metadataFile)
			}

			json, err = sjson.SetBytes(json, query, replaceVal)
			if err != nil {
				return fmt.Errorf("Error setting default value of variable: %s. error: %w",
					variable, err)
			}
		}
	}

	modifiedYaml, err := yaml.JSONToYAML([]byte(json))
	if err != nil {
		return err
	}

	err = os.WriteFile(path.Join(dir, metadataFile), modifiedYaml, 0644)
	if err != nil {
		return err
	}

	fmt.Printf("Successfully replaced default values in %s\n", metadataFile)
	return nil
}