1 import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from "../../types"
2 import type {KeywordCxt} from "../../compile/validate"
3 import {_, str, operators, Code} from "../../compile/codegen"
7 type Kwd = "maximum" | "minimum" | "exclusiveMaximum" | "exclusiveMinimum"
9 type Comparison = "<=" | ">=" | "<" | ">"
11 const KWDs: {[K in Kwd]: {okStr: Comparison; ok: Code; fail: Code}} = {
12 maximum: {okStr: "<=", ok: ops.LTE, fail: ops.GT},
13 minimum: {okStr: ">=", ok: ops.GTE, fail: ops.LT},
14 exclusiveMaximum: {okStr: "<", ok: ops.LT, fail: ops.GTE},
15 exclusiveMinimum: {okStr: ">", ok: ops.GT, fail: ops.LTE},
18 export type LimitNumberError = ErrorObject<
20 {limit: number; comparison: Comparison},
21 number | {$data: string}
24 const error: KeywordErrorDefinition = {
25 message: ({keyword, schemaCode}) => str`must be ${KWDs[keyword as Kwd].okStr} ${schemaCode}`,
26 params: ({keyword, schemaCode}) =>
27 _`{comparison: ${KWDs[keyword as Kwd].okStr}, limit: ${schemaCode}}`,
30 const def: CodeKeywordDefinition = {
31 keyword: Object.keys(KWDs),
36 code(cxt: KeywordCxt) {
37 const {keyword, data, schemaCode} = cxt
38 cxt.fail$data(_`${data} ${KWDs[keyword as Kwd].fail} ${schemaCode} || isNaN(${data})`)