RecurrenceRule.fromICalString constructor

RecurrenceRule.fromICalString(
  1. 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,
  );
}