"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const codegen_1 = require("../../compile/codegen"); const metadata_1 = require("./metadata"); const nullable_1 = require("./nullable"); const error_1 = require("./error"); const types_1 = require("../discriminator/types"); const error = { message: (cxt) => { const { schema, params } = cxt; return params.discrError ? params.discrError === types_1.DiscrError.Tag ? `tag "${schema}" must be string` : `value of tag "${schema}" must be in mapping` : (0, error_1.typeErrorMessage)(cxt, "object"); }, params: (cxt) => { const { schema, params } = cxt; return params.discrError ? (0, codegen_1._) `{error: ${params.discrError}, tag: ${schema}, tagValue: ${params.tag}}` : (0, error_1.typeErrorParams)(cxt, "object"); }, }; const def = { keyword: "discriminator", schemaType: "string", implements: ["mapping"], error, code(cxt) { (0, metadata_1.checkMetadata)(cxt); const { gen, data, schema, parentSchema } = cxt; const [valid, cond] = (0, nullable_1.checkNullableObject)(cxt, data); gen.if(cond); validateDiscriminator(); gen.elseIf((0, codegen_1.not)(valid)); cxt.error(); gen.endIf(); cxt.ok(valid); function validateDiscriminator() { const tag = gen.const("tag", (0, codegen_1._) `${data}${(0, codegen_1.getProperty)(schema)}`); gen.if((0, codegen_1._) `${tag} === undefined`); cxt.error(false, { discrError: types_1.DiscrError.Tag, tag }); gen.elseIf((0, codegen_1._) `typeof ${tag} == "string"`); validateMapping(tag); gen.else(); cxt.error(false, { discrError: types_1.DiscrError.Tag, tag }, { instancePath: schema }); gen.endIf(); } function validateMapping(tag) { gen.if(false); for (const tagValue in parentSchema.mapping) { gen.elseIf((0, codegen_1._) `${tag} === ${tagValue}`); gen.assign(valid, applyTagSchema(tagValue)); } gen.else(); cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag }, { instancePath: schema, schemaPath: "mapping", parentSchema: true }); gen.endIf(); } function applyTagSchema(schemaProp) { const _valid = gen.name("valid"); cxt.subschema({ keyword: "mapping", schemaProp, jtdDiscriminator: schema, }, _valid); return _valid; } }, }; exports.default = def; //# sourceMappingURL=discriminator.js.map