Parse the timeout from a user-provided string.
This supports the following formats:
-
Number "x"
, which produces a relative timeout with the given scale factor. -
(Number ("d" | "h" | "m" | "s" | "ms" | "us") (" ")?)+
, which produces an absolute timeout with the duration given by the sum of the given units. -
"none"
, which produces Timeout.none.
Throws a FormatException if timeout
is not in a valid format
Source
factory Timeout.parse(String timeout) { var scanner = new StringScanner(timeout); // First check for the string "none". if (scanner.scan("none")) { scanner.expectDone(); return Timeout.none; } // Scan a number. This will be either a time unit or a scale factor. scanner.expect(_untilUnit, name: "number"); var number = double.parse(scanner.lastMatch[0]); // A number followed by "x" is a scale factor. if (scanner.scan("x") || scanner.scan("X")) { scanner.expectDone(); return new Timeout.factor(number); } // Parse time units until none are left. The condition is in the middle of // the loop because we've already parsed the first number. var microseconds = 0.0; while (true) { scanner.expect(_unit, name: "unit"); microseconds += _microsecondsFor(number, scanner.lastMatch[0]); scanner.scan(_whitespace); // Scan the next number, if it's avaialble. if (!scanner.scan(_untilUnit)) break; number = double.parse(scanner.lastMatch[0]); } scanner.expectDone(); return new Timeout(new Duration(microseconds: microseconds.round())); }