From b9b1dd73f58c3ee66161fd316299c0a6772b0a0d Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 21 Feb 2023 01:08:07 +0100 Subject: taler-util: parse duration strings --- packages/taler-util/src/time.ts | 43 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'packages/taler-util/src/time.ts') diff --git a/packages/taler-util/src/time.ts b/packages/taler-util/src/time.ts index 21963ee6b..8b4f4cac3 100644 --- a/packages/taler-util/src/time.ts +++ b/packages/taler-util/src/time.ts @@ -113,6 +113,49 @@ export namespace Duration { return { d_ms: deadline.t_ms - now.t_ms }; } + export function fromPrettyString(s: string): Duration { + let dMs = 0; + let currentNum = ""; + let parsingNum = true; + for (let i = 0; i < s.length; i++) { + const cc = s.charCodeAt(i); + if (cc >= "0".charCodeAt(0) && cc <= "9".charCodeAt(0)) { + if (!parsingNum) { + throw Error("invalid duration, unexpected number"); + } + currentNum += s[i]; + continue; + } + if (s[i] == " ") { + if (currentNum != "") { + parsingNum = false; + } + continue; + } + + if (currentNum == "") { + throw Error("invalid duration, missing number"); + } + + if (s[i] === "s") { + dMs += 1000 * Number.parseInt(currentNum, 10); + } else if (s[i] === "m") { + dMs += 60 * 1000 * Number.parseInt(currentNum, 10); + } else if (s[i] === "h") { + dMs += 60 * 60 * 1000 * Number.parseInt(currentNum, 10); + } else if (s[i] === "d") { + dMs += 24 * 60 * 60 * 1000 * Number.parseInt(currentNum, 10); + } else { + throw Error("invalid duration, unsupported unit"); + } + currentNum = ""; + parsingNum = true; + } + return { + d_ms: dMs, + }; + } + export function max(d1: Duration, d2: Duration): Duration { return durationMax(d1, d2); } -- cgit v1.2.3