private void ConfigureDeploymentFromConfigFile()

in src/AWS.Deploy.CLI/Commands/DeployCommand.cs [363:437]


        private void ConfigureDeploymentFromConfigFile(Recommendation recommendation, UserDeploymentSettings userDeploymentSettings)
        {
            foreach (var entry in userDeploymentSettings.LeafOptionSettingItems)
            {
                var optionSettingJsonPath = entry.Key;
                var optionSettingValue = entry.Value;

                var optionSetting = recommendation.GetOptionSetting(optionSettingJsonPath);

                if (optionSetting == null)
                    throw new OptionSettingItemDoesNotExistException(DeployToolErrorCode.OptionSettingItemDoesNotExistInRecipe, $"The Option Setting Item {optionSettingJsonPath} does not exist.");

                if (!recommendation.IsExistingCloudApplication || optionSetting.Updatable)
                {
                    object settingValue;
                    try
                    {
                        switch (optionSetting.Type)
                        {
                            case OptionSettingValueType.String:
                                settingValue = optionSettingValue;
                                break;
                            case OptionSettingValueType.Int:
                                settingValue = int.Parse(optionSettingValue);
                                break;
                            case OptionSettingValueType.Bool:
                                settingValue = bool.Parse(optionSettingValue);
                                break;
                            case OptionSettingValueType.Double:
                                settingValue = double.Parse(optionSettingValue);
                                break;
                            case OptionSettingValueType.KeyValue:
                                var optionSettingKey = optionSettingJsonPath.Split(".").Last();
                                var existingValue = recommendation.GetOptionSettingValue<Dictionary<string, string>>(optionSetting);
                                existingValue ??= new Dictionary<string, string>();
                                existingValue[optionSettingKey] = optionSettingValue;
                                settingValue = existingValue;
                                break;
                            default:
                                throw new InvalidOverrideValueException(DeployToolErrorCode.InvalidValueForOptionSettingItem, $"Invalid value {optionSettingValue} for option setting item {optionSettingJsonPath}");
                        }
                    }
                    catch (Exception exception)
                    {
                        _toolInteractiveService.WriteDebugLine(exception.PrettyPrint());
                        throw new InvalidOverrideValueException(DeployToolErrorCode.InvalidValueForOptionSettingItem, $"Invalid value {optionSettingValue} for option setting item {optionSettingJsonPath}");
                    }

                    optionSetting.SetValueOverride(settingValue);

                    SetDeploymentBundleOptionSetting(recommendation, optionSetting.Id, settingValue);
                }
            }

            var validatorFailedResults =
                        recommendation.Recipe
                            .BuildValidators()
                            .Select(validator => validator.Validate(recommendation, _session))
                            .Where(x => !x.IsValid)
                            .ToList();

            if (!validatorFailedResults.Any())
            {
                // validation successful
                // deployment configured
                return;
            }

            var errorMessage = "The deployment configuration needs to be adjusted before it can be deployed:" + Environment.NewLine;
            foreach (var result in validatorFailedResults)
            {
                errorMessage += result.ValidationFailedMessage + Environment.NewLine;
            }
            throw new InvalidUserDeploymentSettingsException(DeployToolErrorCode.DeploymentConfigurationNeedsAdjusting, errorMessage.Trim());
        }