lib/graphql/response.ex

defmodule GraphQL.Response do
  @moduledoc """
  Functions to handle GraphQL responses
  """
  @enforce_keys [:success?]
  defstruct [:data, :errors, :success?]

  @typedoc """
  A struct that contains the GraphQL response data.
  """
  @type t :: %__MODULE__{
          data: any(),
          errors: any(),
          success?: true | false | :partial
        }

  @doc """
  Creates a succes response with the given data

  ## Examples

      iex> success(%{field: "value"})
      %GraphQL.Response{success?: true, data: %{field: "value"}}
  """
  @spec success(map) :: t()
  def success(data) do
    %__MODULE__{success?: true, data: data, errors: nil}
  end

  @doc """
  Creates a new failure response with  the given errors

  ## Examples

      iex> failure([%{message: "some error", locations: [%{line: 2, column: 5}]}])
      %GraphQL.Response{success?: false, errors: [%{message: "some error", locations: [%{line: 2, column: 5}]}]}
  """
  @spec failure(map) :: t()
  def failure(errors) do
    %__MODULE__{success?: false, data: nil, errors: errors}
  end

  @doc """
  Create a new partial success response with the given data and errors

  ## Examples

      iex> data = %{field: "value"}
      %{field: "value"}
      iex> errors = [%{message: "some error", locations: [%{line: 2, column: 5}]}]
      [%{message: "some error", locations: [%{line: 2, column: 5}]}]
      iex> partial_success(data, errors)
      %GraphQL.Response{success?: :partial, data: %{field: "value"}, errors: [%{message: "some error", locations: [%{line: 2, column: 5}]}]}
  """
  @spec partial_success(map(), list()) :: t()
  def partial_success(data, errors) do
    %__MODULE__{success?: :partial, data: data, errors: errors}
  end
end