in lib/swaggerValidator/semanticValidator.ts [334:403]
private async validateDiscriminator(
transformCtx: TransformContext,
errors: SemanticErrorDetail[]
) {
const { objSchemas, jsonLoader } = transformCtx;
for (const sch of objSchemas) {
const d = sch.discriminator;
if (d === undefined) {
continue;
}
const info = getInfo(sch);
const rootInfo = getRootObjectInfo(info!);
if (sch.required?.find((x) => x === d) === undefined) {
const meta = getOavErrorMeta("DISCRIMINATOR_NOT_REQUIRED", { property: d });
this.addErrorsFromErrorCode(errors, rootInfo.url, meta, sch);
}
if (sch.properties?.[d] === undefined) {
const meta = getOavErrorMeta("OBJECT_MISSING_REQUIRED_PROPERTY_DEFINITION", {
property: d,
});
this.addErrorsFromErrorCode(errors, rootInfo.url, meta, sch);
} else {
const discriminatorProp = jsonLoader.resolveRefObj(sch.properties[d]);
if (discriminatorProp.type !== "string") {
const meta = getOavErrorMeta("INVALID_DISCRIMINATOR_TYPE", {
property: d,
});
this.addErrorsFromErrorCode(errors, rootInfo.url, meta, sch);
continue;
}
if (discriminatorProp.enum !== undefined && sch.discriminatorMap !== undefined) {
for (const childSchRef of Object.values(sch.discriminatorMap)) {
if (childSchRef === null) {
continue;
}
const childSch = jsonLoader.resolveRefObj(childSchRef);
const discriminatorValue = childSch[xmsDiscriminatorValue];
if (
discriminatorValue !== undefined &&
!discriminatorProp.enum.includes(discriminatorValue)
) {
const meta = getOavErrorMeta("INVALID_XMS_DISCRIMINATOR_VALUE", {
value: discriminatorValue,
});
const url = getRootObjectInfo(getInfo(childSch)!).url;
this.addErrorsFromErrorCode(errors, url, meta, childSch);
}
}
}
}
}
for (const sch of objSchemas) {
if (!sch._missingDiscriminator) {
continue;
}
const info = getInfo(sch);
const rootInfo = getRootObjectInfo(info!);
const meta = getOavErrorMeta("DISCRIMINATOR_PROPERTY_NOT_FOUND", {
value: sch[xmsDiscriminatorValue],
});
this.addErrorsFromErrorCode(errors, rootInfo.url, meta, sch);
}
}