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);
}
}