parseUnitSpecificDuration function
Implementation
Duration parseUnitSpecificDuration(String unitSpecificDuration) {
String durationString = unitSpecificDuration;
if (durationString.isEmpty) {
throw Exception('Duration string must be non-empty: $unitSpecificDuration');
}
bool isNegative = durationString[0] == '-';
if (isNegative) {
durationString = durationString.substring(1);
}
int wholeValue;
int wholeValueMicroMultiplier;
int fractionalValue;
int fractionValueMicroMultiplier;
if (durationString.endsWith('ms')) {
durationString = durationString.substring(0, durationString.length - 2);
wholeValueMicroMultiplier = _microsPerMillisecond;
fractionValueMicroMultiplier = 1;
} else if (durationString.endsWith('us')) {
durationString = durationString.substring(0, durationString.length - 2);
wholeValueMicroMultiplier = 1;
fractionValueMicroMultiplier = 0; // there should never a microsecond fraction.
} else if (durationString.endsWith('s')) {
durationString = durationString.substring(0, durationString.length - 1);
wholeValueMicroMultiplier = _microsPerSecond;
fractionValueMicroMultiplier = _microsPerMillisecond;
} else {
throw Exception('Unit-specific durations must specify the time unit: "$unitSpecificDuration"');
}
final timeComponents = durationString.split('+');
if (timeComponents.length == 1) {
wholeValue = int.parse(timeComponents[0]);
fractionalValue = 0;
} else if (timeComponents.length == 2) {
wholeValue = int.parse(timeComponents[0]);
fractionalValue = int.parse(timeComponents[1].substring(1)); // Remove leading '.' from fraction
} else {
throw Exception('Invalid unit-specific duration: "$unitSpecificDuration');
}
final signMultiplier = isNegative ? -1 : 1;
return Duration(
microseconds:
((wholeValue * wholeValueMicroMultiplier) + (fractionalValue * fractionValueMicroMultiplier)) * signMultiplier,
);
}