func resolveParameters()

in internal/config/core/parameter.go [97:155]


func resolveParameters(
	configProviders []task.ConfigProvider,
	inputsFromUserInputs map[string]string,
) (resolvedParameters, error) {
	rv := make(resolvedParameters)
	for k, v := range inputsFromUserInputs {
		rv[k] = v
	}

	var paramsList []parameterSettings
	for _, cp := range configProviders {
		if cp.Provider.Name != configProviderNameParameter {
			continue
		}
		params, err := loadParameterSettings(cp)
		if err != nil {
			return nil, err
		}

		paramsList = append(paramsList, params)
	}
	if len(paramsList) == 0 {
		// no parameter to resolve
		return rv, nil
	}

	// pass 1: fill with user inputs or prompt
	for _, params := range paramsList {
		if _, ok := rv[params.Name]; ok {
			// already resolved
			continue
		}

		if params.OnMissing == parameterOnMissingPrompt {
			value, err := promptForParameter(fmt.Sprintf("Please input value for parameter %q", params.Name))
			if err != nil {
				return nil, fmt.Errorf("failed to prompt for parameter %q: %w", params.Name, err)
			}
			rv[params.Name] = value
		}
	}

	// pass 2: backfill default or error
	for _, params := range paramsList {
		if _, ok := rv[params.Name]; ok {
			// already resolved
			continue
		}

		switch params.OnMissing {
		case parameterOnMissingError:
			return nil, fmt.Errorf("missing required parameter %q", params.Name)
		case parameterOnMissingEmpty:
			rv[params.Name] = ""
		}
	}

	return rv, nil
}