private async validateDiscriminator()

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);
    }
  }