private async visitSchema()

in packages/libs/oai2-to-oai3/src/converter.ts [588:678]


  private async visitSchema(
    target: MappingTreeObject<oai3.Schema>,
    schemaValue: any,
    schemaItemMemebers: () => Iterable<Node>,
  ) {
    for (const { key, value, pointer, childIterator } of schemaItemMemebers()) {
      switch (key) {
        case "$ref":
          await this.copyRef(target as any, { $ref: value }, pointer);
          break;
        case "additionalProperties":
          if (typeof value === "boolean") {
            if (value === true) {
              target.__set__(key, { value, sourcePointer: pointer });
            } // false is assumed anyway in autorest.
          } else {
            target.__set__(key, this.newObject(pointer));
            await this.visitSchema(target[key]! as any, value, childIterator);
          }
          break;
        case "required":
        case "title":
        case "description":
        case "default":
        case "multipleOf":
        case "maximum":
        case "exclusiveMaximum":
        case "minimum":
        case "exclusiveMinimum":
        case "maxLength":
        case "minLength":
        case "pattern":
        case "maxItems":
        case "minItems":
        case "uniqueItems":
        case "maxProperties":
        case "minProperties":
        case "readOnly":
          target.__set__(key, { value, sourcePointer: pointer });
          break;
        case "enum":
          target.__set__("enum", this.newArray(pointer));
          await this.visitEnum(target.enum!, childIterator);
          break;
        case "allOf":
          target.__set__("allOf", this.newArray(pointer));
          await this.visitAllOf(target.allOf!, childIterator);
          break;
        case "items":
          target.__set__(key, this.newObject(pointer));
          await this.visitSchema(target[key]! as any, value, childIterator);
          break;
        case "properties":
          target.__set__(key, this.newObject(pointer));
          await this.visitProperties(target[key]!, childIterator);
          break;
        case "type":
        case "format":
          target.__set__(key, { value, sourcePointer: pointer });
          break;
        // in OpenAPI 3 the discriminator its an object instead of a string.
        case "discriminator":
          target.__set__("discriminator", this.newObject(pointer));
          target.discriminator!.__set__("propertyName", { value, sourcePointer: pointer });
          break;
        case "xml":
          this.visitXml(target, key, value, pointer);
          break;
        case "externalDocs":
          this.visitExternalDocs(target, key, value, pointer);
          break;
        case "example":
          target.__set__("example", { value, sourcePointer: pointer });
          break;
        case "x-nullable":
          target.__set__("nullable", { value, sourcePointer: pointer });

          // NOTE: this matches the previous converter behavior ... when a $ref
          // is inside the schema copy the properties as they are don't update
          // names, but also leave the new `nullable` field so that OpenAPI 3
          // readers pick it up correctly.
          if (schemaValue.$ref !== undefined) {
            target.__set__("x-nullable", { value, sourcePointer: pointer });
          }
          break;
        default:
          await this.visitExtensions(target, key, value, pointer);
          break;
      }
    }
  }