RecurrenceRule.fromICalString constructor
RecurrenceRule.fromICalString(
- String icalString
Implementation
factory RecurrenceRule.fromICalString(String icalString) {
final frequencyString =
icalString.replaceAll('RRULE:FREQ=', '').split(';').first.toUpperCase();
final frequency = Frequency.values.firstWhere(
(f) => f.name.toUpperCase() == frequencyString,
orElse: () => Frequency.SECONDLY);
final interval = icalString.contains(';INTERVAL=')
? int.parse(icalString.split(';INTERVAL=').last.split(';').first)
: 1;
final count = icalString.contains(';COUNT=')
? int.parse(icalString.split(';COUNT=').last.split(';').first)
: null;
final untilString = icalString.contains(';UNTIL=')
? icalString.split(';UNTIL=').last
: null;
final wkstString = icalString.contains(';WKST=')
? icalString.split(';WKST=').last.split(';').first
: null;
final wkst =
wkstString != null ? WeekdayExtension.fromICalString(wkstString) : null;
DateTime? until;
if (untilString != null) {
final regex = RegExp(r'^\d{8}T\d{6}Z');
final dateString = regex.stringMatch(untilString)?.trim();
until = dateString != null ? DateTime.parse(dateString).toUtc() : null;
}
final bySecond = _parseIntListFromIcalString(icalString, 'BYSECOND');
final byMinute = _parseIntListFromIcalString(icalString, 'BYMINUTE');
final byHour = _parseIntListFromIcalString(icalString, 'BYHOUR');
var days = icalString.contains(';BYDAY=')
? icalString
.split(';BYDAY=')
.last
.split(',')
.map((e) => e.trim())
.toList()
: null;
List<DayOfWeek>? byDay;
if (days != null) {
for (var i = 0; i < days.length; i++) {
byDay ??= [];
final day = days[i];
byDay.add(DayOfWeek.fromICalString(day));
}
} else {
byDay = null;
}
final byMonthDay = _parseIntListFromIcalString(icalString, 'BYMONTHDAY');
final byYearDay = _parseIntListFromIcalString(icalString, 'BYYEARDAY');
final byWeekNo = _parseIntListFromIcalString(icalString, 'BYWEEKNO');
final byMonth = _parseIntListFromIcalString(icalString, 'BYMONTH');
final bySetPosition = _parseIntListFromIcalString(icalString, 'BYSETPOS');
return RecurrenceRule(
frequency: frequency,
interval: interval,
count: count,
until: until,
bySecond: bySecond,
byMinute: byMinute,
byHour: byHour,
byDay: byDay,
byMonthDay: byMonthDay,
byYearDay: byYearDay,
byWeekNo: byWeekNo,
byMonth: byMonth,
weekStart: wkst,
bySetPosition: bySetPosition,
);
}