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)); } }
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); } } }
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); } } }
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); } }
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); }
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); } }
public void Parse(string str, CrontabFieldAccumulator acc) { TryParse(str, acc, ErrorHandling.Throw); }