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