openapi: 3.0.3
info:
  title: Example API
  version: 1.0.0
components:
  schemas:
    Test:
      type: object
      properties:
        value:
          type: number
      required:
        - value
    Tag:
      type: string
      minLength: 3
      maxLength: 10
      pattern: "^[a-zA-Z]+$"
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            name:
              type: string
            message:
              type: string
            data:
              type: array
              items:
                type: object
          required:
            - name
            - message
            - data
      required:
        - error
    Reffy:
      type: object
      properties:
        tag:
          $ref: "#/components/schemas/Tag"
        value:
          type: string
          minLength: 1
      required:
        - value
  parameters:
    hello:
      name: hello
      in: query
      required: true
      schema:
        type: string
        minLength: 1
    RequestIdHeader:
      name: x-request-id
      in: header
      required: true
      schema:
        type: string
        minLength: 1
        pattern: "^[0-9]+$"
  responses:
    Error:
      description: Error response
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error"
  requestBodies:
    pong:
      required: true
      content:
        application/json:
          schema:
            type: object
            properties:
              ping:
                type: string
                enum:
                  - pong
            additionalProperties: false
            required:
              - ping
  headers:
    hullo:
      schema:
        type: string
        minLength: 2
paths:
  /echo:
    post:
      description: Echo input back
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  type: string
              required:
                - input
      responses:
        "200":
          description: Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  output:
                    type: string
                required:
                  - output
        default:
          $ref: "#/components/responses/Error"
  /match:
    post:
      description: Echo input back
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  type: string
              required:
                - input
      responses:
        "200":
          description: Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  output:
                    type: string
                required:
                  - output
        default:
          $ref: "#/components/responses/Error"
  /match/{optional}:
    post:
      description: Echo url-param back
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  type: string
              required:
                - input
      parameters:
        - name: optional
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  output:
                    type: string
                required:
                  - output
        default:
          $ref: "#/components/responses/Error"

  /internal-ref:
    post:
      responses:
        "200":
          description: Response
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Test"
  /parameters:
    get:
      parameters:
        - name: param
          in: query
          required: true
          schema:
            type: string
        - name: porom
          in: query
          schema:
            type: string
      responses:
        "200":
          description: Response
  /parameters/required:
    get:
      parameters:
        - name: q1
          in: query
          required: true
          schema:
            type: string
            minLength: 1
        - name: q2
          in: query
          required: true
          schema:
            type: string
            minLength: 1
      responses:
        200:
          description: Response
  /parameters/header:
    get:
      parameters:
        - name: x-param
          in: header
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Response
  /parameters/header/caseinsensitive:
    get:
      parameters:
        - name: X-Param
          in: header
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Response
  /parameters/cookie:
    get:
      parameters:
        - name: session
          in: cookie
          required: true
          schema:
            type: string
            minLength: 1
      responses:
        "200":
          description: Response
  /parameters/id/{id}:
    get:
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            pattern: "^[0-9]+$"
      responses:
        "200":
          description: Response
  /parameters/all-operations-id/{pid}:
    parameters:
      - name: pid
        in: path
        required: true
        schema:
          type: string
          pattern: "^[0-9]+$"
    get:
      responses:
        "200":
          description: Response
  /parameters/both-all-operations-id/{pid}/{id}:
    parameters:
      - name: pid
        in: path
        required: true
        schema:
          type: string
          pattern: "^[0-9]+$"
    get:
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            pattern: "^[0-9]+$"
      responses:
        "200":
          description: Response
  /parameters/override/{pid}:
    parameters:
      - name: pid
        in: path
        required: true
        schema:
          type: string
          pattern: "^[^0-9]+$"
    get:
      parameters:
        - name: pid
          in: path
          required: true
          schema:
            type: string
            pattern: "^[0-9]+$"
      responses:
        "200":
          description: Response
  /parameters/with-refs:
    get:
      parameters:
        - $ref: "#/components/parameters/RequestIdHeader"
      responses:
        "200":
          description: Response
  /nullable:
    post:
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                bar:
                  type: string
                baz:
                  type: string
                  nullable: true
      responses:
        "200":
          description: Response
  /ref-parameter:
    get:
      parameters:
        - $ref: "#/components/parameters/hello"
      responses:
        "200":
          description: Response
  /different-rules:
    post:
      parameters:
        - name: q1
          in: query
          schema:
            $ref: "#/components/schemas/Tag"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                i:
                  type: integer
                  multipleOf: 2
                  minimum: 2
                  maximum: 256
      responses:
        "200":
          description: Response
  /required-body:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                a:
                  type: string
              required:
                - a
      responses:
        "200":
          description: Response
  /format:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                i32:
                  type: integer
                  format: int32
                i64:
                  type: integer
                  format: int64
                f:
                  type: number
                  format: float
                d:
                  type: number
                  format: double
                byte:
                  type: string
                  format: byte
                binary:
                  type: string
                  format: binary
                password:
                  type: string
                  format: password
                date:
                  type: string
                  format: date
      responses:
        "200":
          description: Response
  /responses:
    post:
      responses:
        2XX:
          description: Generic 2xx response
        "201":
          description: Created response
          content:
            application/json:
              schema:
                type: object
                properties:
                  hello:
                    type: string
                required:
                  - hello
        default:
          description: Default response
  /responses/no-default:
    get:
      responses:
        "200":
          description: Response
  /responses/header:
    post:
      responses:
        default:
          description: Default response
          headers:
            X-HEADER:
              required: true
              schema:
                type: string
            X-Ref-Header:
              schema:
                $ref: "#/components/schemas/Tag"
            content-type:
              required: true
              schema:
                type: string
            x-empty:
              description: Empty header value
              content:
                application/json:
                  schema: {}
  /responses/header2:
    post:
      responses:
        "200":
          description: Response
          headers:
            X-1:
              required: true
              schema:
                type: string
            x-2:
              required: true
              schema:
                type: string
  /schema-references:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Reffy"
      responses:
        "200":
          description: Response
  /more-references:
    post:
      requestBody:
        $ref: "#/components/requestBodies/pong"
      responses:
        "200":
          description: Response
          headers:
            x-hullo:
              $ref: "#/components/headers/hullo"
  /extra-oas-fields-in-schema:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: string
              example: abc
              readOnly: true
              writeOnly: false
              xml: {}
              externalDocs: {}
              deprecated: false
      responses:
        "200":
          description: Response
  /discriminator:
    post:
      requestBody:
        content:
          application/json:
            schema:
              type: object
              discriminator:
                propertyName: foo
              required:
                - foo
              oneOf:
                - properties:
                    foo:
                      const: x
                    a:
                      type: string
                  required:
                    - a
                - properties:
                    foo:
                      enum:
                        - y
                        - z
                    b:
                      type: string
                  required:
                    - b
