Esempio n. 1
0
        public T TryParse <T>(string str, CrontabFieldAccumulator <T> acc, T success, Func <ExceptionProvider, T> errorSelector)
        {
            if (acc == null)
            {
                throw new ArgumentNullException(nameof(acc));
            }

            if (string.IsNullOrEmpty(str))
            {
                return(success);
            }

            try
            {
                return(InternalParse(str, acc, success, errorSelector));
            }
            catch (FormatException e)
            {
                return(OnParseException(e, str, errorSelector));
            }
            catch (CrontabException e)
            {
                return(OnParseException(e, str, errorSelector));
            }
        }
Esempio n. 2
0
        public ExceptionProvider TryParse(string str, CrontabFieldAccumulator acc, ExceptionHandler onError)
        {
            if (acc == null)
            {
                throw new ArgumentNullException("acc");
            }

            if (string.IsNullOrEmpty(str))
            {
                return(null);
            }

            try
            {
                return(InternalParse(str, acc, onError));
            }
            catch (FormatException e)
            {
                return(OnParseException(e, str, onError));
            }
            catch (CrontabException e)
            {
                return(OnParseException(e, str, onError));
            }
        }
        /// <summary>
        /// Parses the specified STR.
        /// </summary>
        /// <param name="str">The STR.</param>
        /// <param name="acc">The acc.</param>
        /// <remarks></remarks>
        public void Parse(string str, CrontabFieldAccumulator acc)
        {
            if (acc == null)
            {
                throw new ArgumentNullException("acc");
            }

            if (string.IsNullOrEmpty(str))
            {
                return;
            }

            try
            {
                InternalParse(str, acc);
            }
            catch (FormatException e)
            {
                ThrowParseException(e, str);
            }
            catch (CrontabException e)
            {
                ThrowParseException(e, str);
            }
        }
        private void InternalParse(string str, CrontabFieldAccumulator acc)
        {
            if (str.Length == 0)
            {
                throw new FormatException("A crontab field value cannot be empty.");
            }

            var commaIndex = str.IndexOf(",", StringComparison.Ordinal);

            if (commaIndex > 0)
            {
                foreach (var token in str.Split(Comma))
                {
                    InternalParse(token, acc);
                }
            }
            else
            {
                var every      = 1;
                var slashIndex = str.IndexOf("/", StringComparison.Ordinal);

                if (slashIndex > 0)
                {
                    every = int.Parse(str.Substring(slashIndex + 1), CultureInfo.InvariantCulture);
                    str   = str.Substring(0, slashIndex);
                }

                if (str.Length == 1 && str[0] == '*')
                {
                    acc(-1, -1, every);
                    return;
                }

                var dashIndex = str.IndexOf("-", StringComparison.Ordinal);
                if (dashIndex > 0)
                {
                    var first = ParseValue(str.Substring(0, dashIndex));
                    var last  = ParseValue(str.Substring(dashIndex + 1));

                    acc(first, last, every);
                    return;
                }


                var value = ParseValue(str);

                if (every == 1)
                {
                    acc(value, value, 1);
                }
                else
                {
                    acc(value, _maxValue, every);
                }
            }
        }
Esempio n. 5
0
 public void Parse(string str, CrontabFieldAccumulator <ExceptionProvider> acc) =>
 TryParse(str, acc, null, ep => throw ep());
        private void InternalParse(string str, CrontabFieldAccumulator acc)
        {
            Debug.Assert(str != null);
            Debug.Assert(acc != null);

            if (str.Length == 0)
            {
                throw new FormatException("A crontab field value cannot be empty.");
            }

            //
            // Next, look for a list of values (e.g. 1,2,3).
            //

            var commaIndex = str.IndexOf(",", StringComparison.Ordinal);

            if (commaIndex > 0)
            {
                foreach (var token in str.Split(Comma))
                {
                    InternalParse(token, acc);
                }
            }
            else
            {
                var every = 1;

                //
                // Look for stepping first (e.g. */2 = every 2nd).
                //

                var slashIndex = str.IndexOf("/", StringComparison.Ordinal);

                if (slashIndex > 0)
                {
                    every = int.Parse(str.Substring(slashIndex + 1), CultureInfo.InvariantCulture);
                    str   = str.Substring(0, slashIndex);
                }

                //
                // Next, look for wildcard (*).
                //

                if (str.Length == 1 && str[0] == '*')
                {
                    acc(-1, -1, every);
                    return;
                }

                //
                // Next, look for a range of values (e.g. 2-10).
                //

                var dashIndex = str.IndexOf("-", StringComparison.Ordinal);

                if (dashIndex > 0)
                {
                    var first = ParseValue(str.Substring(0, dashIndex));
                    var last  = ParseValue(str.Substring(dashIndex + 1));

                    acc(first, last, every);
                    return;
                }

                //
                // Finally, handle the case where there is only one number.
                //

                var value = ParseValue(str);

                if (every == 1)
                {
                    acc(value, value, 1);
                }
                else
                {
                    Debug.Assert(every != 0);

                    acc(value, _maxValue, every);
                }
            }
        }
Esempio n. 7
0
        T InternalParse <T>(string str, CrontabFieldAccumulator <T> acc, T success, Func <ExceptionProvider, T> errorSelector)
        {
            Debug.Assert(str != null);
            Debug.Assert(acc != null);

            if (str.Length == 0)
            {
                return(errorSelector(() => new CrontabException("A crontab field value cannot be empty.")));
            }

            //
            // Next, look for a list of values (e.g. 1,2,3).
            //

            var commaIndex = str.IndexOf(",");

            if (commaIndex > 0)
            {
                var result = success;
                var token  = ((IEnumerable <string>)str.Split(StringSeparatorStock.Comma)).GetEnumerator();
                while (token.MoveNext() && result == null)
                {
                    result = InternalParse(token.Current, acc, success, errorSelector);
                }
                return(result);
            }

            var every = 1;

            //
            // Look for stepping first (e.g. */2 = every 2nd).
            //

            var slashIndex = str.IndexOf("/");

            if (slashIndex > 0)
            {
                every = int.Parse(str.Substring(slashIndex + 1), CultureInfo.InvariantCulture);
                str   = str.Substring(0, slashIndex);
            }

            //
            // Next, look for wildcard (*).
            //

            if (str.Length == 1 && str[0] == '*')
            {
                return(acc(-1, -1, every, success, errorSelector));
            }

            //
            // Next, look for a range of values (e.g. 2-10).
            //

            var dashIndex = str.IndexOf("-");

            if (dashIndex > 0)
            {
                var first = ParseValue(str.Substring(0, dashIndex));
                var last  = ParseValue(str.Substring(dashIndex + 1));

                return(acc(first, last, every, success, errorSelector));
            }

            //
            // Finally, handle the case where there is only one number.
            //

            var value = ParseValue(str);

            if (every == 1)
            {
                return(acc(value, value, 1, success, errorSelector));
            }

            Debug.Assert(every != 0);
            return(acc(value, MaxValue, every, success, errorSelector));
        }
        private void InternalParse(string str, CrontabFieldAccumulator acc)
        {
            Debug.Assert(str != null);
            Debug.Assert(acc != null);

            if (str.Length == 0)
                throw new CrontabException("A crontab field value cannot be empty.");

            //
            // Next, look for a list of values (e.g. 1,2,3).
            //
    
            var commaIndex = str.IndexOf(",");

            if (commaIndex > 0)
            {
                foreach (var token in str.Split(_comma))
                    InternalParse(token, acc);
            }
            else
            {
                var every = 1;

                //
                // Look for stepping first (e.g. */2 = every 2nd).
                // 

                var slashIndex = str.IndexOf("/");

                if (slashIndex > 0)
                {
                    every = int.Parse(str.Substring(slashIndex + 1), CultureInfo.InvariantCulture);
                    str = str.Substring(0, slashIndex);
                }

                //
                // Next, look for wildcard (*).
                //
    
                if (str.Length == 1 && str[0]== '*')
                {
                    acc(-1, -1, every);
                    return;
                }

                //
                // Next, look for a range of values (e.g. 2-10).
                //

                var dashIndex = str.IndexOf("-");
        
                if (dashIndex > 0)
                {
                    var first = ParseValue(str.Substring(0, dashIndex));
                    var last = ParseValue(str.Substring(dashIndex + 1));
        
                    acc(first, last, every);
                    return;
                }

                //
                // Finally, handle the case where there is only one number.
                //

                var value = ParseValue(str);

                if (every == 1)
                {
                    acc(value, value, 1);
                }
                else
                {
                    Debug.Assert(every != 0);

                    acc(value, _maxValue, every);
                }
            }
        }
        /// <summary>
        /// Parses the specified STR.	
        /// </summary>
        /// <param name="str">The STR.</param>
        /// <param name="acc">The acc.</param>
        /// <remarks></remarks>
        public void Parse(string str, CrontabFieldAccumulator acc)
        {
            if (acc == null)
                throw new ArgumentNullException("acc");

            if (string.IsNullOrEmpty(str))
                return;

            try
            {
                InternalParse(str, acc);
            }
            catch (FormatException e)
            {
                ThrowParseException(e, str);
            }
            catch (CrontabException e)
            {
                ThrowParseException(e, str);
            }
        }
Esempio n. 10
0
		private ExceptionProvider InternalParse(string str, CrontabFieldAccumulator acc, ExceptionHandler onError)
		{
			Debug.Assert(str != null);
			Debug.Assert(acc != null);

			if (str.Length == 0)
				return ErrorHandling.OnError(() => new CrontabException("A crontab field value cannot be empty."), onError);

			//
			// Next, look for a list of values (e.g. 1,2,3).
			//

			var commaIndex = str.IndexOf(",");

			if (commaIndex > 0)
			{
				ExceptionProvider e = null;
				var token = ((IEnumerable<string>)str.Split(_comma)).GetEnumerator();
				while (token.MoveNext() && e == null)
					e = InternalParse(token.Current, acc, onError);
				return e;
			}

			var every = 1;

			//
			// Look for stepping first (e.g. */2 = every 2nd).
			// 

			var slashIndex = str.IndexOf("/");

			if (slashIndex > 0)
			{
				every = int.Parse(str.Substring(slashIndex + 1), CultureInfo.InvariantCulture);
				str = str.Substring(0, slashIndex);
			}

			//
			// Next, look for wildcard (*).
			//

			if (str.Length == 1 && str[0] == '*')
			{
				return acc(-1, -1, every, onError);
			}

			//
			// Next, look for a range of values (e.g. 2-10).
			//

			var dashIndex = str.IndexOf("-");

			if (dashIndex > 0)
			{
				var first = ParseValue(str.Substring(0, dashIndex));
				var last = ParseValue(str.Substring(dashIndex + 1));

				return acc(first, last, every, onError);
			}

			//
			// Finally, handle the case where there is only one number.
			//

			var value = ParseValue(str);

			if (every == 1)
				return acc(value, value, 1, onError);

			Debug.Assert(every != 0);
			return acc(value, _maxValue, every, onError);
		}
Esempio n. 11
0
		public ExceptionProvider TryParse(string str, CrontabFieldAccumulator acc, ExceptionHandler onError)
		{
			if (acc == null)
				throw new ArgumentNullException("acc");

			if (string.IsNullOrEmpty(str))
				return null;

			try
			{
				return InternalParse(str, acc, onError);
			}
			catch (FormatException e)
			{
				return OnParseException(e, str, onError);
			}
			catch (CrontabException e)
			{
				return OnParseException(e, str, onError);
			}
		}
Esempio n. 12
0
		public void Parse(string str, CrontabFieldAccumulator acc)
		{
			TryParse(str, acc, ErrorHandling.Throw);
		}
Esempio n. 13
0
 public void Parse(string str, CrontabFieldAccumulator acc)
 {
     TryParse(str, acc, ErrorHandling.Throw);
 }