Example #1
0
        public ListRuleEvaluator(RuleModel rule, string configurations)
        {
            this.list       = JsonConvert.DeserializeObject <ListRuleEvaluatorConfigurationsModel>(configurations);
            this.ignoreCase = rule.IgnoreCase;

            // Expand array to individual values
            this.list.Whitelist = this.list.Whitelist
                                  ?.Select(set => set.Expand())
                                  .SelectMany(g => g)
                                  .ToList();

            this.list.Blacklist = this.list.Blacklist
                                  ?.Select(model => model.Expand())
                                  .SelectMany(g => g)
                                  .ToList();

            // Search for the first blacklist/whitelist item has unexpected or missing placeholders
            var placeholders = new HashSet <string>(PlaceholderHelper.GetPlaceholders(rule.Pattern));
            var brokenItem   =
                this.list.Whitelist?.FirstOrDefault(item => !placeholders.SetEquals(item.Keys)) ??
                this.list.Blacklist?.FirstOrDefault(item => !placeholders.SetEquals(item.Values.Keys))?.Values;

            if (brokenItem == null)
            {
                return;
            }

            var unexpectedPlaceholders = brokenItem.Keys.Except(placeholders);

            if (unexpectedPlaceholders.Any())
            {
                throw new InvalidConfigurationUnexpectedPlaceholdersException(rule, unexpectedPlaceholders, brokenItem);
            }

            var missingPlaceholders = placeholders.Except(brokenItem.Keys);

            if (missingPlaceholders.Any())
            {
                throw new InvalidConfigurationUncheckedPlaceholdersException(rule, missingPlaceholders, brokenItem);
            }
        }