diff options
author | Florian Dold <florian@dold.me> | 2023-02-21 01:08:07 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2023-02-21 01:08:07 +0100 |
commit | b9b1dd73f58c3ee66161fd316299c0a6772b0a0d (patch) | |
tree | e78c98b17becd67bb17663d0070ba1c346c23f9a /packages/taler-util/src/time.ts | |
parent | a49959d2c8bf82575c5d232217a33d91e7b008e8 (diff) | |
download | wallet-core-b9b1dd73f58c3ee66161fd316299c0a6772b0a0d.tar.xz |
taler-util: parse duration strings
Diffstat (limited to 'packages/taler-util/src/time.ts')
-rw-r--r-- | packages/taler-util/src/time.ts | 43 |
1 files changed, 43 insertions, 0 deletions
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); } |