parseRrule function
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,
);
}