Alarm.fromICalString constructor

Alarm.fromICalString(
  1. String icalString
)

Implementation

factory Alarm.fromICalString(String icalString) {
  final durationRegex = RegExp(
    r'^TRIGGER:(?<sign>-)?P(?:(?<days>\d+)D)?T?(?:(?<hours>\d+)H)?(?:(?<minutes>\d+)M)?(?:(?<seconds>\d+)S)?|TRIGGER:(?<sign2>-)?PT(?:(?<hours2>\d+)H)?(?:(?<minutes2>\d+)M)?(?:(?<seconds2>\d+)S)?$',
    caseSensitive: false,
    multiLine: true,
  );

  final durationMatch = durationRegex.firstMatch(icalString);
  if (durationMatch == null) {
    throw FormatException('Invalid duration format');
  }

  final isNegative = durationMatch.namedGroup('sign') != null ||
      durationMatch.namedGroup('sign2') != null;
  final days = int.tryParse(durationMatch.namedGroup('days') ?? '0') ?? 0;
  final hours = int.tryParse(durationMatch.namedGroup('hours') ?? '0') ??
      int.tryParse(durationMatch.namedGroup('hours2') ?? '0') ??
      0;
  final minutes = int.tryParse(durationMatch.namedGroup('minutes') ?? '0') ??
      int.tryParse(durationMatch.namedGroup('minutes2') ?? '0') ??
      0;
  final seconds = int.tryParse(durationMatch.namedGroup('seconds') ?? '0') ??
      int.tryParse(durationMatch.namedGroup('seconds2') ?? '0') ??
      0;

  var duration = Duration(
    days: days,
    hours: hours,
    minutes: minutes,
    seconds: seconds,
  );

  duration = duration.multiplyWithSign(duration, isNegative ? 1 : -1);

  final descriptionMatch = RegExp(r'DESCRIPTION:(.*)').firstMatch(icalString);
  final description = descriptionMatch?.group(1)?.trim();

  return Alarm(duration: duration, description: description);
}