From af0ab46f2155b8caffd68cb8830c903c55a836b6 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Sat, 13 May 2017 02:39:03 -0700 Subject: [PATCH] config/validator: add some validation methods. --- lib/node/config.js | 77 ++++++++++++++++++++++++++++++++++++++++-- lib/utils/validator.js | 43 ++++++++++++++++++++--- 2 files changed, 112 insertions(+), 8 deletions(-) diff --git a/lib/node/config.js b/lib/node/config.js index 52f0b871..2be15322 100644 --- a/lib/node/config.js +++ b/lib/node/config.js @@ -284,17 +284,88 @@ Config.prototype.num = function num(key, fallback) { if (typeof value !== 'string') { if (typeof value !== 'number') - throw new Error(key + ' must be a string.'); + throw new Error(key + ' must be a positive integer.'); return value; } if (!/^\d+$/.test(value)) - throw new Error(key + ' must be a number.'); + throw new Error(key + ' must be a positive integer.'); value = parseInt(value, 10); if (!isFinite(value)) - throw new Error(key + ' must be a number.'); + throw new Error(key + ' must be a positive integer.'); + + return value; +}; + +/** + * Get a config option (as a float). + * @param {String} key + * @param {Object?} fallback + * @returns {Number|null} + */ + +Config.prototype.flt = function flt(key, fallback) { + var value = this.get(key); + + if (fallback === undefined) + fallback = null; + + if (value === null) + return fallback; + + if (typeof value !== 'string') { + if (typeof value !== 'number') + throw new Error(key + ' must be a float.'); + return value; + } + + if (!/^\d*(?:\.\d*)?$/.test(value)) + throw new Error(key + ' must be a float.'); + + value = parseFloat(value); + + if (!isFinite(value)) + throw new Error(key + ' must be a float.'); + + return value; +}; + +/** + * Get a value (as a satoshi number or btc string). + * @param {String} key + * @param {Object?} fallback + * @returns {Number|null} + */ + +Config.prototype.amt = function amt(key, fallback) { + var value = this.get(key); + + if (fallback === undefined) + fallback = null; + + if (value === null) + return fallback; + + if (typeof value !== 'string') { + if (typeof value !== 'number') + throw new Error(key + ' must be an amount.'); + return value; + } + + if (!/^\d+(\.\d{0,8})?$/.test(value)) + throw new Error(key + ' must be an amount.'); + + value = parseFloat(value); + + if (!isFinite(value)) + throw new Error(key + ' must be an amount.'); + + value *= 1e8; + + if (value % 1 !== 0 || value < 0 || value > 0x1fffffffffffff) + throw new Error(key + ' must be an amount (uint64).'); return value; }; diff --git a/lib/utils/validator.js b/lib/utils/validator.js index 8003d9ab..1ba0d118 100644 --- a/lib/utils/validator.js +++ b/lib/utils/validator.js @@ -153,6 +153,39 @@ Validator.prototype.num = function num(key, fallback) { return value; }; +/** + * Get a value (as a number). + * @param {String} key + * @param {Object?} fallback + * @returns {Number|null} + */ + +Validator.prototype.flt = function flt(key, fallback) { + var value = this.get(key); + + if (fallback === undefined) + fallback = null; + + if (value === null) + return fallback; + + if (typeof value !== 'string') { + if (typeof value !== 'number') + throw new ValidationError(fmt(key) + ' must be a float.'); + return value; + } + + if (!/^\d*(?:\.\d*)?$/.test(value)) + throw new ValidationError(fmt(key) + ' must be a float.'); + + value = parseFloat(value); + + if (!isFinite(value)) + throw new ValidationError(fmt(key) + ' must be a float.'); + + return value; +}; + /** * Get a value (as a uint32). * @param {String} key @@ -259,22 +292,22 @@ Validator.prototype.amt = function amt(key, fallback) { if (typeof value !== 'string') { if (typeof value !== 'number') - throw new ValidationError(fmt(key) + ' must be a number.'); + throw new ValidationError(fmt(key) + ' must be an amount.'); return value; } if (!/^\d+(\.\d{0,8})?$/.test(value)) - throw new ValidationError(fmt(key) + ' must be a number.'); + throw new ValidationError(fmt(key) + ' must be an amount.'); value = parseFloat(value); if (!isFinite(value)) - throw new ValidationError(fmt(key) + ' must be a number.'); + throw new ValidationError(fmt(key) + ' must be an amount.'); value *= 1e8; if (value % 1 !== 0 || value < 0 || value > 0x1fffffffffffff) - throw new ValidationError(fmt(key) + ' must be a uint64.'); + throw new ValidationError(fmt(key) + ' must be an amount (uint64).'); return value; }; @@ -298,7 +331,7 @@ Validator.prototype.btc = function btc(key, fallback) { value *= 1e8; if (value % 1 !== 0 || value < 0 || value > 0x1fffffffffffff) - throw new ValidationError(fmt(key) + ' must be a uint64.'); + throw new ValidationError(fmt(key) + ' must be a btc float (uint64).'); return value; };