// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\r // SPDX-License-Identifier: Apache-2.0 using System.Threading.Tasks; namespace AWS.Deploy.Common.Recipes.Validation { public enum ComparisonValidatorOperation { GreaterThan } /// /// The validator is typically used with OptionSettingItems which have a numeric type. /// The validator requires two configuration options to be specific, the Operation and the SettingId. /// The validator checks if the set value of the OptionSettingItem satisfies the comparison operation with SettingId. /// public class ComparisonValidator : IOptionSettingItemValidator { public ComparisonValidatorOperation? Operation { get; set; } public string? SettingId { get;set; } private readonly IOptionSettingHandler _optionSettingHandler; public ComparisonValidator(IOptionSettingHandler optionSettingHandler) { _optionSettingHandler = optionSettingHandler; } public Task Validate(object input, Recommendation recommendation, OptionSettingItem optionSettingItem) { if (Operation == null) throw new MissingValidatorConfigurationException(DeployToolErrorCode.MissingValidatorConfiguration, $"The validator of type '{typeof(ComparisonValidator)}' is missing the configuration property '{nameof(Operation)}'."); if (string.IsNullOrEmpty(SettingId)) throw new MissingValidatorConfigurationException(DeployToolErrorCode.MissingValidatorConfiguration, $"The validator of type '{typeof(ComparisonValidator)}' is missing the configuration property '{nameof(SettingId)}'."); if (!double.TryParse(input?.ToString(), out double inputDouble)) return ValidationResult.FailedAsync($"The value of '{optionSettingItem.Name}' is not a numeric value."); var comparisonSetting = _optionSettingHandler.GetOptionSetting(recommendation, SettingId); var comparisonSettingValue = _optionSettingHandler.GetOptionSettingValue(recommendation, comparisonSetting); if (!double.TryParse(comparisonSettingValue?.ToString(), out double comparisonSettingValueDouble)) return ValidationResult.FailedAsync($"The value of '{comparisonSetting.Name}' is not a numeric value."); if (Operation == ComparisonValidatorOperation.GreaterThan) { if (inputDouble > comparisonSettingValueDouble) return ValidationResult.ValidAsync(); else return ValidationResult.FailedAsync($"The value of '{optionSettingItem.Name}' must be greater than the value of '{comparisonSetting.Name}'."); } else { return ValidationResult.FailedAsync($"The operation '{Operation}' is not yet supported."); } } } }