private async Task ConfigureDeploymentFromCli()

in src/AWS.Deploy.CLI/Commands/DeployCommand.cs [721:801]


        private async Task ConfigureDeploymentFromCli(Recommendation recommendation, OptionSettingItem setting)
        {
            _toolInteractiveService.WriteLine(string.Empty);
            _toolInteractiveService.WriteLine($"{setting.Name}:");
            _toolInteractiveService.WriteLine($"{setting.Description}");

            object currentValue = _optionSettingHandler.GetOptionSettingValue(recommendation, setting);
            object? settingValue = null;

            if (setting.TypeHint.HasValue && _typeHintCommandFactory.GetCommand(setting.TypeHint.Value) is var typeHintCommand && typeHintCommand != null)
            {
                settingValue = await typeHintCommand.Execute(recommendation, setting);
            }
            else
            {
                if (setting.AllowedValues?.Count > 0)
                {
                    var userInputConfig = new UserInputConfiguration<string>(
                        idSelector: x => x,
                        displaySelector: x => setting.ValueMapping.ContainsKey(x) ? setting.ValueMapping[x] : x,
                        defaultSelector: x => x.Equals(currentValue))
                    {
                        CreateNew = false
                    };

                    var userResponse = _consoleUtilities.AskUserToChooseOrCreateNew(setting.AllowedValues, string.Empty, userInputConfig);
                    settingValue = userResponse.SelectedOption;

                    // If they didn't change the value then don't store so we can rely on using the default in the recipe.
                    if (Equals(settingValue, currentValue))
                        return;
                }
                else
                {
                    switch (setting.Type)
                    {
                        case OptionSettingValueType.String:
                        case OptionSettingValueType.Int:
                        case OptionSettingValueType.Double:
                            settingValue = _consoleUtilities.AskUserForValue(string.Empty, currentValue.ToString() ?? "", allowEmpty: true, resetValue: _optionSettingHandler.GetOptionSettingDefaultValue<string>(recommendation, setting) ?? "");
                            break;
                        case OptionSettingValueType.Bool:
                            var answer = _consoleUtilities.AskYesNoQuestion(string.Empty, _optionSettingHandler.GetOptionSettingValue(recommendation, setting).ToString());
                            settingValue = answer == YesNo.Yes ? "true" : "false";
                            break;
                        case OptionSettingValueType.KeyValue:
                            settingValue = _consoleUtilities.AskUserForKeyValue(!string.IsNullOrEmpty(currentValue.ToString()) ? (Dictionary<string, string>) currentValue : new Dictionary<string, string>());
                            break;
                        case OptionSettingValueType.List:
                            var valueList = new SortedSet<string>();
                            if (!string.IsNullOrEmpty(currentValue.ToString()))
                                valueList = ((SortedSet<string>) currentValue).DeepCopy();
                            settingValue = _consoleUtilities.AskUserForList(valueList);
                            break;
                        case OptionSettingValueType.Object:
                            foreach (var childSetting in setting.ChildOptionSettings)
                            {
                                if (_optionSettingHandler.IsOptionSettingDisplayable(recommendation, childSetting) && (!recommendation.IsExistingCloudApplication || childSetting.Updatable))
                                    await ConfigureDeploymentFromCli(recommendation, childSetting);
                            }
                            break;
                        default:
                            throw new ArgumentOutOfRangeException();
                    }
                }
            }

            if (settingValue != null)
            {
                try
                {
                    await _optionSettingHandler.SetOptionSettingValue(recommendation, setting, settingValue);
                }
                catch (ValidationFailedException ex)
                {
                    _toolInteractiveService.WriteErrorLine(ex.Message);

                    await ConfigureDeploymentFromCli(recommendation, setting);
                }
            }
        }