コード例 #1
0
        private static ValueOrError <CrontabSchedule> TryParse(string expression, ExceptionHandler onError)
        {
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }

            var tokens = expression.Split(_separators, StringSplitOptions.RemoveEmptyEntries);

            if (tokens.Length != 5)
            {
                return(ErrorHandling.OnError(() => new CrontabException(string.Format(
                                                                            "'{0}' is not a valid crontab expression. It must contain at least 5 components of a schedule "
                                                                            + "(in the sequence of minutes, hours, days, months, days of week).",
                                                                            expression)), onError));
            }

            var fields = new CrontabField[5];

            for (var i = 0; i < fields.Length; i++)
            {
                var field = CrontabField.TryParse((CrontabFieldKind)i, tokens[i], onError);
                if (field.IsError)
                {
                    return(field.ErrorProvider);
                }

                fields[i] = field.Value;
            }

            return(new CrontabSchedule(fields[0], fields[1], fields[2], fields[3], fields[4]));
        }
コード例 #2
0
        public static T TryParse <T>(string expression, ParseOptions options, Converter <CrontabSchedule, T> valueSelector, Converter <ExceptionProvider, T> errorSelector)
        {
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }

            var tokens = expression.Split(StringSeparatorStock.Space, StringSplitOptions.RemoveEmptyEntries);

            var includingSeconds   = options != null && options.IncludingSeconds;
            var expectedTokenCount = includingSeconds ? 6 : 5;

            if (tokens.Length < expectedTokenCount || tokens.Length > expectedTokenCount)
            {
                return(errorSelector(() =>
                {
                    var message = string.Format(
                        "'{0}' is an invalid crontab expression. It must contain {1}.",
                        expression,
                        includingSeconds
                        ? "6 components of a schedule in the sequence of seconds, minutes, hours, days, months, and days of week"
                        : "5 components of a schedule in the sequence of minutes, hours, days, months, and days of week");
                    return new CrontabException(message);
                }));
            }

            var fields = new CrontabField[6];

            var offset = includingSeconds ? 0 : 1;

            for (var i = 0; i < tokens.Length; i++)
            {
                var kind  = (CrontabFieldKind)i + offset;
                var field = CrontabField.TryParse(kind, tokens[i], v => new { ErrorProvider = (ExceptionProvider)null, Value = v },
                                                  e => new { ErrorProvider = e, Value = (CrontabField)null });
                if (field.ErrorProvider != null)
                {
                    return(errorSelector(field.ErrorProvider));
                }
                fields[i + offset] = field.Value;
            }

            return(valueSelector(new CrontabSchedule(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5])));
        }