func()

in custom-targets/util/applysetters/apply_setters.go [213:273]


func (as *ApplySetters) visitScalar(object *yaml.RNode, path string) error {
	if object.IsNil() {
		return nil
	}

	if object.YNode().Kind != yaml.ScalarNode {
		// return if it is not a scalar node
		return nil
	}

	// perform a direct set of the field if it matches
	setterPattern := extractSetterPattern(object.YNode().LineComment)
	if setterPattern == "" {
		// the node is not tagged with setter pattern
		return nil
	}

	curPattern := setterPattern
	if !shouldSet(setterPattern, as.Setters) {
		// this means there is no intent from user to modify this setter tagged resources
		return nil
	}

	// replace the setter names in comment pattern with provided values
	for _, setter := range as.Setters {
		setterPattern = strings.ReplaceAll(
			setterPattern,
			fmt.Sprintf("${%s}", setter.Name),
			fmt.Sprintf("%v", setter.Value),
		)
	}

	// replace the remaining setter names in comment pattern with values derived from current
	// field value, these values are not provided by user
	currentSetterValues := currentSetterValues(curPattern, object.YNode().Value)
	for setterName, setterValue := range currentSetterValues {
		setterPattern = strings.ReplaceAll(
			setterPattern,
			fmt.Sprintf("${%s}", setterName),
			fmt.Sprintf("%v", setterValue),
		)
	}

	// check if there are unresolved setters and throw error
	urs := unresolvedSetters(setterPattern)
	if len(urs) > 0 {
		return errors.Errorf("values for setters %v must be provided", urs)
	}

	object.YNode().Value = setterPattern
	if setterPattern == "" {
		object.YNode().Style = yaml.DoubleQuotedStyle
	}
	object.YNode().Tag = yaml.NodeTagEmpty
	as.Results = append(as.Results, &Result{
		FilePath:  as.filePath,
		FieldPath: strings.TrimPrefix(path, "."),
		Value:     object.YNode().Value,
	})
	return nil
}