@jsonjoy.com/json-type
Version:
High-performance JSON Pointer implementation
127 lines (126 loc) • 4.58 kB
JavaScript
;
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;