lib/oasis.ex

defmodule Oasis do
  @moduledoc false

  defmodule InvalidSpecError do
    defexception message: "use some invalid specification to generate modules"

    @moduledoc """
    Error raised when use some invalid OpenAPI specification to generate corresponding modules.
    """
  end

  defmodule FileNotFoundError do
    defexception message: "failed to open file to generate modules"

    @moduledoc """
    Error raised when use an invalid file path to generate corresponding modules.
    """
  end

  defmodule BadRequestError do
    @moduledoc """
    Error raised when some reason could not process the request due to client error.
    """
    defexception message: "invalid request", use_in: nil, param_name: nil, error: nil, plug_status: 400

    defmodule Invalid do
      @moduledoc """
      This error is used to indicate could not parse a parameter into the type due to client error.
      """
      defstruct [:value]
    end

    defmodule Required do
      @moduledoc """
      This error is used to indicate there missing a required parameter due to client error.
      """
      defstruct([])
    end

    defmodule JsonSchemaValidationFailed do
      @moduledoc """
      This error is used to indicate could not pass the validation of the defined json schema.

      This module is an equivalent replacement to `ExJsonSchema.Validator.Error`, we could see more detailed information
      in the `:error` field be with `"ExJsonSchema.Validator.Error.*"` modules.
      """
      defstruct [:error, :path]
    end

    defmodule InvalidToken do
      @moduledoc """
      This error is used to indicate the provided token is expired, revoked, malformed, or invalid.
      """
      defstruct([])
    end

  end

  defmodule CacheRawBodyReader do
    @moduledoc false

    def read_body(conn, opts) do
      {:ok, body, conn} = Plug.Conn.read_body(conn, opts)
      conn = update_in(conn.assigns[:raw_body], &[body | &1 || []])
      {:ok, body, conn}
    end
  end

end