taler-util: parse duration strings
This commit is contained in:
parent
a49959d2c8
commit
b9b1dd73f5
39
packages/taler-util/src/time.test.ts
Normal file
39
packages/taler-util/src/time.test.ts
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
This file is part of GNU Taler
|
||||||
|
(C) 2019 GNUnet e.V.
|
||||||
|
|
||||||
|
GNU Taler is free software; you can redistribute it and/or modify it under the
|
||||||
|
terms of the GNU General Public License as published by the Free Software
|
||||||
|
Foundation; either version 3, or (at your option) any later version.
|
||||||
|
|
||||||
|
GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with
|
||||||
|
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
import test from "ava";
|
||||||
|
import { Duration } from "./time.js";
|
||||||
|
|
||||||
|
test("duration parsing", (t) => {
|
||||||
|
const d1 = Duration.fromPrettyString("1h");
|
||||||
|
t.deepEqual(d1.d_ms, 60 * 60 * 1000);
|
||||||
|
|
||||||
|
const d2 = Duration.fromPrettyString(" 2h 1s 3m");
|
||||||
|
t.deepEqual(d2.d_ms, 2 * 60 * 60 * 1000 + 3 * 60 * 1000 + 1000);
|
||||||
|
|
||||||
|
t.throws(() => {
|
||||||
|
Duration.fromPrettyString("5g");
|
||||||
|
});
|
||||||
|
t.throws(() => {
|
||||||
|
Duration.fromPrettyString("s");
|
||||||
|
});
|
||||||
|
t.throws(() => {
|
||||||
|
Duration.fromPrettyString("s5");
|
||||||
|
});
|
||||||
|
t.throws(() => {
|
||||||
|
Duration.fromPrettyString("5 5 s");
|
||||||
|
});
|
||||||
|
});
|
@ -113,6 +113,49 @@ export namespace Duration {
|
|||||||
return { d_ms: deadline.t_ms - now.t_ms };
|
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 {
|
export function max(d1: Duration, d2: Duration): Duration {
|
||||||
return durationMax(d1, d2);
|
return durationMax(d1, d2);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user