1--[[ 2 Licensed according to the included 'LICENSE' document 3 Author: Thomas Harning Jr <harningt@gmail.com> 4]] 5local tostring = tostring 6local assert = assert 7local jsonutil = require("json.util") 8local huge = require("math").huge 9 10local _ENV = nil 11 12local defaultOptions = { 13 nan = true, 14 inf = true 15} 16 17local modeOptions = {} 18modeOptions.strict = { 19 nan = false, 20 inf = false 21} 22 23local function mergeOptions(options, mode) 24 jsonutil.doOptionMerge(options, false, 'number', defaultOptions, mode and modeOptions[mode]) 25end 26 27 28local function encodeNumber(number, options) 29 if number ~= number then 30 assert(options.nan, "Invalid number: NaN not enabled") 31 return "NaN" 32 end 33 if number == huge then 34 assert(options.inf, "Invalid number: Infinity not enabled") 35 return "Infinity" 36 end 37 if number == -huge then 38 assert(options.inf, "Invalid number: Infinity not enabled") 39 return "-Infinity" 40 end 41 return tostring(number) 42end 43 44local function getEncoder(options) 45 options = options and jsonutil.merge({}, defaultOptions, options) or defaultOptions 46 return { 47 number = function(number, state) 48 return encodeNumber(number, options) 49 end 50 } 51end 52 53local number = { 54 mergeOptions = mergeOptions, 55 getEncoder = getEncoder 56} 57 58return number 59