| 17 | $data: true, |
| 18 | error, |
| 19 | code(cxt: KeywordCxt) { |
| 20 | const {gen, data, $data, schema, schemaCode, it} = cxt |
| 21 | if (!$data && schema.length === 0) throw new Error("enum must have non-empty array") |
| 22 | const useLoop = schema.length >= it.opts.loopEnum |
| 23 | let eql: Name | undefined |
| 24 | const getEql = (): Name => (eql ??= useFunc(gen, equal)) |
| 25 | |
| 26 | let valid: Code |
| 27 | if (useLoop || $data) { |
| 28 | valid = gen.let("valid") |
| 29 | cxt.block$data(valid, loopEnum) |
| 30 | } else { |
| 31 | /* istanbul ignore if */ |
| 32 | if (!Array.isArray(schema)) throw new Error("ajv implementation error") |
| 33 | const vSchema = gen.const("vSchema", schemaCode) |
| 34 | valid = or(...schema.map((_x: unknown, i: number) => equalCode(vSchema, i))) |
| 35 | } |
| 36 | cxt.pass(valid) |
| 37 | |
| 38 | function loopEnum(): void { |
| 39 | gen.assign(valid, false) |
| 40 | gen.forOf("v", schemaCode as Code, (v) => |
| 41 | gen.if(_`${getEql()}(${data}, ${v})`, () => gen.assign(valid, true).break()) |
| 42 | ) |
| 43 | } |
| 44 | |
| 45 | function equalCode(vSchema: Name, i: number): Code { |
| 46 | const sch = schema[i] |
| 47 | return typeof sch === "object" && sch !== null |
| 48 | ? _`${getEql()}(${data}, ${vSchema}[${i}])` |
| 49 | : _`${data} === ${sch}` |
| 50 | } |
| 51 | }, |
| 52 | } |
| 53 | |
| 54 | export default def |