func ExpandParameters()

in cmd/hub/parameters/eval.go [255:327]


func ExpandParameters(componentName, componentKind string, componentDepends []string,
	parameters LockedParameters, outputs CapturedOutputs,
	componentParameters []manifest.Parameter) ([]LockedParameter, []error) {

	// make outputs of the same component kind invisible
	outputFilter := func(output CapturedOutput) bool {
		return !(componentKind != "" && componentKind == output.ComponentKind)
	}
	kv := ParametersAndOutputsKV(parameters, outputs, outputFilter)
	kv["hub.componentName"] = componentName
	// expand, check for cycles
	expanded := make([]LockedParameter, 0, len(componentParameters)+3)
	expanded = append(expanded, LockedParameter{Name: "hub.componentName", Value: componentName})
	errs := make([]error, 0)
	for _, parameter := range componentParameters {
		fqName := parameterQualifiedName(parameter.Name, componentName)
		v, exist := FindValue(parameter.Name, componentName, componentDepends, kv)
		if exist {
			parameter.Value = v
			if RequireExpansion(parameter.Value) {
				errs = append(errs, ExpandParameter(&parameter, componentDepends, kv)...)
			}
		} else {
			if parameter.Kind == "user" {
				util.Warn("Component `%s` user-level parameter `%s` must be propagated to stack level parameter",
					componentName, fqName)
			}
			if util.Empty(parameter.Value) && !util.Empty(parameter.Default) {
				parameter.Value = parameter.Default
			}
			if util.Empty(parameter.Value) {
				if parameter.Empty == "allow" {
					if config.Debug {
						log.Printf("Empty parameter `%s` value allowed", fqName)
					}
					parameter.Value = ""
				} else {
					errs = append(errs, fmt.Errorf("Parameter `%s` value cannot be derived from stack parameters nor outputs", fqName))
					parameter.Value = "(unknown)"
				}
			} else {
				if RequireExpansion(parameter.Value) {
					errs = append(errs, ExpandParameter(&parameter, componentDepends, kv)...)
				}
			}
		}

		if config.Trace {
			log.Printf("--- %s | %s => %v", parameter.Name, componentName, parameter.Value)
		}

		expanded = append(expanded, LockedParameter{Name: parameter.Name, Value: parameter.Value, Env: parameter.Env})
		kv[parameter.Name] = parameter.Value
	}
	if config.Trace && len(expanded) > 1 {
		log.Print("Parameters expanded:")
		PrintLockedParametersList(expanded)
	}
	if len(errs) > 0 && !config.Force {
		if !config.Trace {
			log.Print("Parameters expanded:")
			PrintLockedParametersList(expanded)
		}
		log.Print("Currently known stack parameters:")
		PrintLockedParameters(parameters)
		if len(outputs) > 0 {
			log.Print("Currently known outputs:")
			PrintCapturedOutputs(outputs)
		}
	}

	return expanded, errs
}