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);
}
}
}