NCrontab.Advanced.CrontabSchedule.ParseFilter C# (CSharp) Method

ParseFilter() private static method

private static ParseFilter ( string filter, CrontabFieldKind kind ) : ICronFilter
filter string
kind CrontabFieldKind
return ICronFilter
        private static ICronFilter ParseFilter(string filter, CrontabFieldKind kind)
        {
            var newFilter = filter.ToUpper();

            try
            {
                if (newFilter.StartsWith("*", StringComparison.OrdinalIgnoreCase))
                {
                    newFilter = newFilter.Substring(1);
                    if (newFilter.StartsWith("/", StringComparison.OrdinalIgnoreCase))
                    {
                        newFilter = newFilter.Substring(1);
                        var steps = GetValue(ref newFilter, kind);
                        return new StepFilter(0, steps, kind);
                    }
                    return new AnyFilter(kind);
                }

                // * * LW * *
                // * * L * *
                if (newFilter.StartsWith("L") && kind == CrontabFieldKind.Day)
                {
                    newFilter = newFilter.Substring(1);
                    if (newFilter == "W")
                        return new LastWeekdayOfMonthFilter(kind);
                    else
                        return new LastDayOfMonthFilter(kind);
                }

                if (newFilter == "?")
                    return new BlankDayOfMonthOrWeekFilter(kind);

                var firstValue = GetValue(ref newFilter, kind);

                if (string.IsNullOrEmpty(newFilter))
                {
                    if (kind == CrontabFieldKind.Year)
                        return new SpecificYearFilter(firstValue, kind);
                    else
                        return new SpecificFilter(firstValue, kind);
                }

                switch (newFilter[0])
                {
                    case '/':
                        {
                            newFilter = newFilter.Substring(1);
                            var secondValue = GetValue(ref newFilter, kind);
                            return new StepFilter(firstValue, secondValue, kind);
                        }
                    case '-':
                    {
                        newFilter = newFilter.Substring(1);
                        var secondValue = GetValue(ref newFilter, kind);
                        int? steps = null;
                        if (newFilter.StartsWith("/"))
                        {
                            newFilter = newFilter.Substring(1);
                            steps = GetValue(ref newFilter, kind);
                        }
                        return new RangeFilter(firstValue, secondValue, steps, kind);
                    }
                    case '#':
                    {
                        newFilter = newFilter.Substring(1);
                        var secondValue = GetValue(ref newFilter, kind);

                        if (!string.IsNullOrEmpty(newFilter))
                            throw new CrontabException(string.Format("Invalid filter '{0}'", filter));

                        return new SpecificDayOfWeekInMonthFilter(firstValue, secondValue, kind);
                    }
                    default:
                        if (newFilter == "L" && kind == CrontabFieldKind.DayOfWeek)
                        {
                            return new LastDayOfWeekInMonthFilter(firstValue, kind);
                        }
                        else if (newFilter == "W" && kind == CrontabFieldKind.Day)
                        {
                            return new NearestWeekdayFilter(firstValue, kind);
                        }
                        break;
                }

                throw new CrontabException(string.Format("Invalid filter '{0}'", filter));
            }
            catch (Exception e)
            {
                throw new CrontabException(string.Format("Invalid filter '{0}'.  See inner exception for details.", filter), e);
            }
        }