import ms from 'ms'; import * as x from 'x-value'; export const rateExpressionSymbol = Symbol(); export const RateExpression = x.atomic(rateExpressionSymbol, value => { if (typeof value !== 'string') { throw new TypeError('Expected a rate expression string'); } getRateExpressionValue(value); }); export type RateExpression = x.Nominal<'rate expression', string>; export function getRateExpressionValue(value: string): number { const groups = /^rate\((.+)\)$/.exec(value); if (!groups) { throw new TypeError('Expected a rate expression string like `rate(15m)`'); } const [, interval] = groups; const rateInterval = ms(interval); if (rateInterval === undefined) { throw new TypeError('Invalid rate expression'); } return rateInterval; }