parseDuration function
Parses duration string formatted by prettyDuration into Duration.
separator
defines the string that splits duration components in the string.
Example: parseDuration('2w 5d 23h 59m 59s 999ms 999us');
Implementation
Duration parseDuration(String input, {String separator = ','}) {
final parts = input.split(separator).map((t) => t.trim()).toList();
int? weeks;
int? days;
int? hours;
int? minutes;
int? seconds;
int? milliseconds;
int? microseconds;
for (String part in parts) {
final match = RegExp(r'^(\d+)(w|d|h|min|m|s|ms|us)$').matchAsPrefix(part);
if (match == null) throw FormatException('Invalid duration format');
int value = int.parse(match.group(1)!);
String? unit = match.group(2);
switch (unit) {
case 'w':
if (weeks != null) {
throw FormatException('Weeks specified multiple times');
}
weeks = value;
break;
case 'd':
if (days != null) {
throw FormatException('Days specified multiple times');
}
days = value;
break;
case 'h':
if (hours != null) {
throw FormatException('Days specified multiple times');
}
hours = value;
break;
case 'min':
case 'm':
if (minutes != null) {
throw FormatException('Days specified multiple times');
}
minutes = value;
break;
case 's':
if (seconds != null) {
throw FormatException('Days specified multiple times');
}
seconds = value;
break;
case 'ms':
if (milliseconds != null) {
throw FormatException('Days specified multiple times');
}
milliseconds = value;
break;
case 'us':
if (microseconds != null) {
throw FormatException('Days specified multiple times');
}
microseconds = value;
break;
default:
throw FormatException('Invalid duration unit $unit');
}
}
return Duration(
days: (days ?? 0) + (weeks ?? 0) * 7,
hours: hours ?? 0,
minutes: minutes ?? 0,
seconds: seconds ?? 0,
milliseconds: milliseconds ?? 0,
microseconds: microseconds ?? 0);
}