public static bool AcceptsEvent(this AdvancedFilterSetting filter, EventGridEvent gridEvent)
        {
            var retVal = filter == null;

            if (retVal)
            {
                return(true);
            }

            // filter is not null
            if (!gridEvent.TryGetValue(filter.Key, out var value))
            {
                return(false);
            }

            switch (filter.OperatorType)
            {
            case AdvancedFilterSetting.OperatorTypeEnum.NumberGreaterThan:
                retVal = Try(() => value.ToNumber() > filter.Value.ToNumber());
                break;

            case AdvancedFilterSetting.OperatorTypeEnum.NumberGreaterThanOrEquals:
                retVal = Try(() => value.ToNumber() >= filter.Value.ToNumber());
                break;

            case AdvancedFilterSetting.OperatorTypeEnum.NumberLessThan:
                retVal = Try(() => value.ToNumber() < filter.Value.ToNumber());
                break;

            case AdvancedFilterSetting.OperatorTypeEnum.NumberLessThanOrEquals:
                retVal = Try(() => value.ToNumber() <= filter.Value.ToNumber());
                break;

            case AdvancedFilterSetting.OperatorTypeEnum.NumberIn:
                retVal = Try(() => (filter.Values ?? new object[0]).Select(v => v.ToNumber()).Contains(value.ToNumber()));
                break;

            case AdvancedFilterSetting.OperatorTypeEnum.NumberNotIn:
                retVal = Try(() => !(filter.Values ?? new object[0]).Select(v => v.ToNumber()).Contains(value.ToNumber()));
                break;

            case AdvancedFilterSetting.OperatorTypeEnum.BoolEquals:
                retVal = Try(() => Convert.ToBoolean(value) == Convert.ToBoolean(filter.Value));
                break;

            case AdvancedFilterSetting.OperatorTypeEnum.StringContains:
            {
                // a string cannot be considered to contain null or and empty string
                var valueAsString       = value as string;
                var filterValueAsString = filter.Value as string;

                retVal = Try(() => !string.IsNullOrEmpty(filterValueAsString) &&
                             !string.IsNullOrEmpty(valueAsString) &&
                             valueAsString.Contains(filterValueAsString, StringComparison.OrdinalIgnoreCase));
            }
            break;

            case AdvancedFilterSetting.OperatorTypeEnum.StringBeginsWith:
            {
                // null or empty values cannot be considered to be the beginning character of a string
                var valueAsString       = value as string;
                var filterValueAsString = filter.Value as string;

                retVal = Try(() => !string.IsNullOrEmpty(filterValueAsString) &&
                             !string.IsNullOrEmpty(valueAsString) &&
                             valueAsString.StartsWith(filterValueAsString, StringComparison.OrdinalIgnoreCase));
            }
            break;

            case AdvancedFilterSetting.OperatorTypeEnum.StringEndsWith:
            {
                // null or empty values cannot be considered to be the end character of a string
                var valueAsString       = value as string;
                var filterValueAsString = filter.Value as string;

                retVal = Try(() => !string.IsNullOrEmpty(filterValueAsString) &&
                             !string.IsNullOrEmpty(valueAsString) &&
                             valueAsString.EndsWith(filterValueAsString, StringComparison.OrdinalIgnoreCase));
            }
            break;

            case AdvancedFilterSetting.OperatorTypeEnum.StringIn:
                retVal = Try(() => (filter.Values ?? new object[0]).Select(v => Convert.ToString(v)?.ToUpper()).Contains(Convert.ToString(value)?.ToUpper()));
                break;

            case AdvancedFilterSetting.OperatorTypeEnum.StringNotIn:
                retVal = Try(() => !(filter.Values ?? new object[0]).Select(v => Convert.ToString(v)?.ToUpper()).Contains(Convert.ToString(value)?.ToUpper()));
                break;
            }

            return(retVal);
        }
        public static bool AcceptsEvent(this AdvancedFilterSetting filter, EventGridEvent gridEvent)
        {
            var retVal = filter == null;

            if (!retVal)
            {
                // filter is not null
                if (gridEvent.TryGetValue(filter.Key, out var value))
                {
                    switch (filter.OperatorType)
                    {
                    case AdvancedFilterSetting.OperatorTypeEnum.NumberGreaterThan:
                        retVal = Try(() => value.ToNumber() > filter.Value.ToNumber());
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.NumberGreaterThanOrEquals:
                        retVal = Try(() => value.ToNumber() >= filter.Value.ToNumber());
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.NumberLessThan:
                        retVal = Try(() => value.ToNumber() < filter.Value.ToNumber());
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.NumberLessThanOrEquals:
                        retVal = Try(() => value.ToNumber() <= filter.Value.ToNumber());
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.NumberIn:
                        retVal = Try(() => (filter.Values ?? new object[0]).Select(v => v.ToNumber()).Contains(value.ToNumber()));
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.NumberNotIn:
                        retVal = Try(() => !(filter.Values ?? new object[0]).Select(v => v.ToNumber()).Contains(value.ToNumber()));
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.BoolEquals:
                        retVal = Try(() => Convert.ToBoolean(value) == Convert.ToBoolean(filter.Value));
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.StringContains:
                        // a string cannot be considered to contain null or and empty string
                        retVal = Try(() => !string.IsNullOrEmpty(Convert.ToString(filter.Value)) && Convert.ToString(value).ToUpper().Contains(Convert.ToString(filter.Value).ToUpper()));
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.StringBeginsWith:
                        // null or empty values cannot be considered to be the beginning character of a string
                        retVal = Try(() => !string.IsNullOrEmpty(Convert.ToString(filter.Value)) && Convert.ToString(value).ToUpper().StartsWith(Convert.ToString(filter.Value).ToUpper()));
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.StringEndsWith:
                        // null or empty values cannot be considered to be the end character of a string
                        retVal = Try(() => !string.IsNullOrEmpty(Convert.ToString(filter.Value)) && Convert.ToString(value).ToUpper().EndsWith(Convert.ToString(filter.Value).ToUpper()));
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.StringIn:
                        retVal = Try(() => (filter.Values ?? new object[0]).Select(v => Convert.ToString(v).ToUpper()).Contains(Convert.ToString(value).ToUpper()));
                        break;

                    case AdvancedFilterSetting.OperatorTypeEnum.StringNotIn:
                        retVal = Try(() => !(filter.Values ?? new object[0]).Select(v => Convert.ToString(v).ToUpper()).Contains(Convert.ToString(value).ToUpper()));
                        break;
                    }
                }
            }

            return(retVal);
        }