parseUnitSpecificDuration function

Duration parseUnitSpecificDuration(
  1. String unitSpecificDuration
)

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,
  );
}