parseRrule function

RecurrenceRule parseRrule(
  1. String input
)

Parses an RRULE string (with or without a leading RRULE:) into a RecurrenceRule. Part order is irrelevant; a duplicate part takes its last value. Throws FormatException when FREQ is missing, a part is malformed, or a part outside the supported subset appears.

Example:

parseRrule('FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE,FR;COUNT=10');

Audited: 2026-06-12 11:26 EDT

Implementation

RecurrenceRule parseRrule(String input) {
  final _RuleParts parts = _RuleParts();
  // Drop an optional `RRULE:` content-line prefix so both forms parse.
  final String body = input.startsWith('RRULE:') ? input.substring('RRULE:'.length) : input;
  for (final String token in body.split(';')) {
    if (token.trim().isEmpty) {
      continue;
    }
    final int eq = token.indexOf('=');
    if (eq < 0) {
      throw FormatException('RRULE part is not NAME=VALUE', token);
    }
    parts.apply(token.substring(0, eq).trim().toUpperCase(), token.substring(eq + 1).trim());
  }
  final RecurFrequency? freq = parts.frequency;
  if (freq == null) {
    throw FormatException('RRULE is missing required FREQ', input);
  }
  return RecurrenceRule(
    frequency: freq,
    interval: parts.interval,
    count: parts.count,
    until: parts.until,
    byWeekDays: parts.byWeekDays,
    byMonthDays: parts.byMonthDays,
    byMonths: parts.byMonths,
    weekStart: parts.weekStart,
  );
}