messageformat-number-skeleton
Version:
A parser & formatter for ICU NumberFormat skeleton strings & patterns
87 lines (86 loc) • 2.3 kB
JavaScript
import { BadOptionError, MissingOptionError, TooManyOptionsError } from '../errors.js';
const maxOptions = {
'compact-short': 0,
'compact-long': 0,
'notation-simple': 0,
scientific: 2,
engineering: 2,
percent: 0,
permille: 0,
'base-unit': 0,
currency: 1,
'measure-unit': 1,
'per-measure-unit': 1,
'unit-width-narrow': 0,
'unit-width-short': 0,
'unit-width-full-name': 0,
'unit-width-iso-code': 0,
'unit-width-hidden': 0,
'precision-integer': 0,
'precision-unlimited': 0,
'precision-currency-standard': 0,
'precision-currency-cash': 0,
'precision-increment': 1,
'rounding-mode-ceiling': 0,
'rounding-mode-floor': 0,
'rounding-mode-down': 0,
'rounding-mode-up': 0,
'rounding-mode-half-even': 0,
'rounding-mode-half-down': 0,
'rounding-mode-half-up': 0,
'rounding-mode-unnecessary': 0,
'integer-width': 1,
scale: 1,
'group-off': 0,
'group-min2': 0,
'group-auto': 0,
'group-on-aligned': 0,
'group-thousands': 0,
latin: 0,
'numbering-system': 1,
'sign-auto': 0,
'sign-always': 0,
'sign-never': 0,
'sign-accounting': 0,
'sign-accounting-always': 0,
'sign-except-zero': 0,
'sign-accounting-except-zero': 0,
'decimal-auto': 0,
'decimal-always': 0
};
const minOptions = {
currency: 1,
'integer-width': 1,
'measure-unit': 1,
'numbering-system': 1,
'per-measure-unit': 1,
'precision-increment': 1,
scale: 1
};
function hasMaxOption(stem) {
return stem in maxOptions;
}
function hasMinOption(stem) {
return stem in minOptions;
}
/** @internal */
export function validOptions(stem, options, onError) {
if (hasMaxOption(stem)) {
const maxOpt = maxOptions[stem];
if (options.length > maxOpt) {
if (maxOpt === 0) {
for (const opt of options)
onError(new BadOptionError(stem, opt));
}
else {
onError(new TooManyOptionsError(stem, options, maxOpt));
}
return false;
}
else if (hasMinOption(stem) && options.length < minOptions[stem]) {
onError(new MissingOptionError(stem));
return false;
}
}
return true;
}