UNPKG

@jsonjoy.com/json-type

Version:

High-performance JSON Pointer implementation

127 lines (126 loc) 4.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NumType = void 0; const util_1 = require("../../util"); const constants_1 = require("../../constants"); const AbsType_1 = require("./AbsType"); class NumType extends AbsType_1.AbsType { constructor(schema) { super(); this.schema = schema; } format(format) { this.schema.format = format; return this; } gt(gt) { this.schema.gt = gt; return this; } gte(gte) { this.schema.gte = gte; return this; } lt(lt) { this.schema.lt = lt; return this; } lte(lte) { this.schema.lte = lte; return this; } codegenValidator(ctx, path, r) { const { format, gt, gte, lt, lte } = this.schema; if (format && util_1.ints.has(format)) { const errInt = ctx.err(constants_1.ValidationError.INT, path); ctx.js(/* js */ `if(!Number.isInteger(${r})) return ${errInt};`); if (util_1.uints.has(format)) { const err = ctx.err(constants_1.ValidationError.UINT, path); ctx.js(/* js */ `if(${r} < 0) return ${err};`); switch (format) { case 'u8': { ctx.js(/* js */ `if(${r} > 0xFF) return ${err};`); break; } case 'u16': { ctx.js(/* js */ `if(${r} > 0xFFFF) return ${err};`); break; } case 'u32': { ctx.js(/* js */ `if(${r} > 0xFFFFFFFF) return ${err};`); break; } } } else { switch (format) { case 'i8': { ctx.js(/* js */ `if(${r} > 0x7F || ${r} < -0x80) return ${errInt};`); break; } case 'i16': { ctx.js(/* js */ `if(${r} > 0x7FFF || ${r} < -0x8000) return ${errInt};`); break; } case 'i32': { ctx.js(/* js */ `if(${r} > 0x7FFFFFFF || ${r} < -0x80000000) return ${errInt};`); break; } } } } else if (util_1.floats.has(format)) { const err = ctx.err(constants_1.ValidationError.NUM, path); ctx.codegen.js(/* js */ `if(!Number.isFinite(${r})) return ${err};`); } else { const err = ctx.err(constants_1.ValidationError.NUM, path); ctx.codegen.js(/* js */ `if(typeof ${r} !== "number") return ${err};`); } if (gt !== undefined) { const err = ctx.err(constants_1.ValidationError.GT, path); ctx.codegen.js(/* js */ `if(${r} <= ${gt}) return ${err};`); } if (gte !== undefined) { const err = ctx.err(constants_1.ValidationError.GTE, path); ctx.codegen.js(/* js */ `if(${r} < ${gte}) return ${err};`); } if (lt !== undefined) { const err = ctx.err(constants_1.ValidationError.LT, path); ctx.codegen.js(/* js */ `if(${r} >= ${lt}) return ${err};`); } if (lte !== undefined) { const err = ctx.err(constants_1.ValidationError.LTE, path); ctx.codegen.js(/* js */ `if(${r} > ${lte}) return ${err};`); } ctx.emitCustomValidators(this, path, r); } codegenJsonTextEncoder(ctx, value) { ctx.js(/* js */ `s += ${value.use()};`); } codegenBinaryEncoder(ctx, value) { const { format } = this.schema; const v = value.use(); if (util_1.uints.has(format)) ctx.js(/* js */ `encoder.writeUInteger(${v});`); else if (util_1.ints.has(format)) ctx.js(/* js */ `encoder.writeInteger(${v});`); else if (util_1.floats.has(format)) ctx.js(/* js */ `encoder.writeFloat(${v});`); else ctx.js(/* js */ `encoder.writeNumber(${v});`); } codegenCborEncoder(ctx, value) { this.codegenBinaryEncoder(ctx, value); } codegenMessagePackEncoder(ctx, value) { this.codegenBinaryEncoder(ctx, value); } codegenJsonEncoder(ctx, value) { this.codegenBinaryEncoder(ctx, value); } toJson(value, system = this.system) { return ('' + value); } } exports.NumType = NumType;