defmodule GraphQL.Client do @moduledoc """ Facade client for GraphQL requests The real backend must implement the execute/4 callback and must be configured by the `:therealreal, GraphQL.Client, :backend` application config. """ alias GraphQL.{Query, Response} @type query :: Query.t() | {String.t(), reference()} | String.t() @doc """ Callback spec for backend implementation """ @callback execute_query( query :: Query.t(), variables :: map(), options :: map() ) :: Response.t() @doc """ Executes the given query, with the given variables and options. """ @spec execute(Query.t(), map(), map()) :: Response.t() def execute(%Query{} = query, variables, options \\ %{}) do backend().execute_query(query, variables, options) end defp backend do Application.fetch_env!(:graphql_client, :backend) end end