public async Task SetValue()

in src/AWS.Deploy.Common/Recipes/OptionSettingItem.ValueOverride.cs [98:180]


        public async Task SetValue(IOptionSettingHandler optionSettingHandler, object valueOverride, IOptionSettingItemValidator[] validators, Recommendation recommendation, bool skipValidation)
        {
            if (!skipValidation)
            {
                foreach (var validator in validators)
                {
                    var result = await validator.Validate(valueOverride, recommendation, this);
                    if (!result.IsValid)
                    {
                        Validation.ValidationStatus = ValidationStatus.Invalid;
                        Validation.ValidationMessage = result.ValidationFailedMessage?.Trim() ?? $"The value '{valueOverride}' is invalid for option setting '{Name}'.";
                        Validation.InvalidValue = valueOverride;
                        throw new ValidationFailedException(DeployToolErrorCode.OptionSettingItemValueValidationFailed, Validation.ValidationMessage);
                    }
                }
            }

            if (AllowedValues != null && AllowedValues.Count > 0 && valueOverride != null &&
                !AllowedValues.Contains(valueOverride.ToString() ?? ""))
            {
                Validation.ValidationStatus = ValidationStatus.Invalid;
                Validation.ValidationMessage = $"Invalid value for option setting item '{Name}'";
                Validation.InvalidValue = valueOverride;
                throw new InvalidOverrideValueException(DeployToolErrorCode.InvalidValueForOptionSettingItem, Validation.ValidationMessage);
            }

            Validation.ValidationStatus = ValidationStatus.Valid;
            Validation.ValidationMessage = string.Empty;
            Validation.InvalidValue = null;

            try
            {
                if (valueOverride is bool || valueOverride is int || valueOverride is long || valueOverride is double || valueOverride is Dictionary<string, string> || valueOverride is SortedSet<string>)
                {
                    _value = valueOverride;
                }
                else if (Type.Equals(OptionSettingValueType.KeyValue))
                {
                    var deserialized = JsonConvert.DeserializeObject<Dictionary<string, string>>(valueOverride?.ToString() ?? "");
                    _value = deserialized;
                }
                else if (Type.Equals(OptionSettingValueType.List))
                {
                    var deserialized = JsonConvert.DeserializeObject<SortedSet<string>>(valueOverride?.ToString() ?? "");
                    _value = deserialized;
                }
                else if (valueOverride is string valueOverrideString)
                {
                    if (bool.TryParse(valueOverrideString, out var valueOverrideBool))
                    {
                        _value = valueOverrideBool;
                    }
                    else if (int.TryParse(valueOverrideString, out var valueOverrideInt))
                    {
                        _value = valueOverrideInt;
                    }
                    else
                    {
                        _value = valueOverrideString;
                    }
                }
                else
                {
                    var deserialized = JsonConvert.DeserializeObject<Dictionary<string, object>>(JsonConvert.SerializeObject(valueOverride));
                    foreach (var childOptionSetting in ChildOptionSettings)
                    {
                        if (deserialized?.TryGetValue(childOptionSetting.Id, out var childValueOverride) ?? false)
                        {
                            await optionSettingHandler.SetOptionSettingValue(recommendation, childOptionSetting, childValueOverride, skipValidation: skipValidation);
                        }
                    }
                }
            }
            catch (JsonReaderException ex)
            {
                Validation.ValidationStatus = ValidationStatus.Invalid;
                Validation.ValidationMessage = $"The value you are trying to set is invalid.";
                Validation.InvalidValue = valueOverride;
                throw new UnsupportedOptionSettingType(DeployToolErrorCode.UnsupportedOptionSettingType,
                    $"The value you are trying to set for the option setting '{Name}' is invalid.",
                    ex);
            }
        }