Alarm.fromICalString constructor
Alarm.fromICalString(
- 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);
}