defmodule Neuron do
@moduledoc """
Neuron is a GraphQL client for elixir.
## Usage
```elixir
iex> Neuron.Config.set(url: "https://example.com/graph")
iex> Neuron.query(\"""
{
films {
title
}
}
\""")
# Response will be:
{:ok, %Neuron.Response{body: %{"data" => {"films" => [%{"title" => "A New Hope"}]}}%, status_code: 200, headers: []}}
# You can also run mutations
iex> Neuron.query(\"""
mutation createUser($name: String!) {
createUser(name: $name) {
id
name
}
}
\""",
%{name: "uesteibar"}
)
"""
@doc """
runs a query request to your graphql endpoint.
## Example
```elixir
Neuron.query(\"""
{
films {
count
}
}
\""")
```
You can pass variables for your query
## Example
```elixir
Neuron.query(
\"""
mutation createUser($name: String!) {
createUser(name: $name) {
id
name
}
}
\""",
%{name: "uesteibar"}
)
```
You can also overwrite parameters set on `Neuron.Config` by passing them as options.
## Example
```elixir
Neuron.query(
\"""
mutation createUser($name: String!) {
createUser(name: $name) {
id
name
}
}
\""",
%{name: "uesteibar"},
url: "https://www.other.com/graphql"
)
```
"""
alias Neuron.{ConfigUtils, Fragment}
@spec query(query_string :: String.t(), variables :: map(), options :: keyword()) ::
{:ok, Neuron.Response.t()}
| {:error, Neuron.Response.t() | Neuron.JSONParseError.t() | HTTPoison.Error.t()}
def query(query_string, variables \\ %{}, options \\ []) do
json_library = ConfigUtils.json_library(options)
query_string
|> Fragment.insert_into_query()
|> build_body()
|> insert_variables(variables)
|> json_library.encode!()
|> run(options)
end
defp run(body, options) do
body
|> run_query(options)
end
defp run_query(body, options) do
connection_module = ConfigUtils.connection_module(options)
connection_module.call(body, options)
end
defp build_body(query_string), do: %{query: query_string}
defp insert_variables(body, variables) do
Map.put(body, :variables, variables)
end
end