in src/AWS.Deploy.CLI/Commands/DeployCommand.cs [742:815]
private async Task ConfigureDeploymentFromCli(Recommendation recommendation, OptionSettingItem setting)
{
_toolInteractiveService.WriteLine(string.Empty);
_toolInteractiveService.WriteLine($"{setting.Name}:");
_toolInteractiveService.WriteLine($"{setting.Description}");
object currentValue = recommendation.GetOptionSettingValue(setting);
object? settingValue = null;
if (setting.AllowedValues?.Count > 0)
{
var userInputConfig = new UserInputConfiguration<string>(
x => setting.ValueMapping.ContainsKey(x) ? setting.ValueMapping[x] : x,
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
{
if (setting.TypeHint.HasValue && _typeHintCommandFactory.GetCommand(setting.TypeHint.Value) is var typeHintCommand && typeHintCommand != null)
{
settingValue = await typeHintCommand.Execute(recommendation, setting);
}
else
{
switch (setting.Type)
{
case OptionSettingValueType.String:
case OptionSettingValueType.Int:
case OptionSettingValueType.Double:
settingValue = _consoleUtilities.AskUserForValue(string.Empty, currentValue.ToString() ?? "", allowEmpty: true, resetValue: recommendation.GetOptionSettingDefaultValue<string>(setting) ?? "");
break;
case OptionSettingValueType.Bool:
var answer = _consoleUtilities.AskYesNoQuestion(string.Empty, recommendation.GetOptionSettingValue(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.Object:
foreach (var childSetting in setting.ChildOptionSettings)
{
if (recommendation.IsOptionSettingDisplayable(childSetting))
await ConfigureDeploymentFromCli(recommendation, childSetting);
}
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
if (!Equals(settingValue, currentValue) && settingValue != null)
{
try
{
setting.SetValueOverride(settingValue);
}
catch (ValidationFailedException ex)
{
_toolInteractiveService.WriteErrorLine(
$"Value [{settingValue}] is not valid: {ex.Message}");
await ConfigureDeploymentFromCli(recommendation, setting);
}
}
}