README.md

# GraphqlBuilder

This package allows creation of a GraphQL query or mutation string to be created
from an Elixir structure. This allows a more "correct by construction" string
versus manually creating the string by hand. This is currently a very minimal
package only intended to make it easier to generate query strings to be used in
Elixir unit tests. The idea for this package was taken from the
[gql-query-builder](https://github.com/atulmy/gql-query-builder) package written
for node development.

Here are some usage examples:

### Simple Query

```
iex> query = %Query{operation: :thoughts, fields: [:id, :name, :thought]}

iex>  GraphqlBuilder.query(query)
query {
  thoughts {
    id,
    name,
    thought
  }
}

```

### Simple Query with Variables
```

iex> query = %Query{
...>   operation: :thoughts,
...>   fields: [:name, :thought],
...>   variables: [id: 12]
...> }

iex> GraphqlBuilder.query(query)
query {
  thoughts(id: 12) {
    name,
    thought
  }
}

```

### Query with Nested Fields

```

iex> query = %Query{
...>   operation: :orders,
...>   fields: [:id, :amount, user: [:id, :name, :email, address: [:city, :country]]]
...> }

iex> GraphqlBuilder.query(query)
query {
  orders {
    id,
    amount,
    user {
      id,
      name,
      email,
      address {
        city,
        country
      }
    }
  }
}

```

### Simple Mutation

```
iex> query = %Query{
...>  operation: :thought_create,
...>  variables: [
...>    name: "Tyrion Lannister'",
...>    thought: "I drink and I know things."
...>  ],
...>  fields: [:id]
...>}

iex> GraphqlBuilder.mutation(query)
mutation {
  thought_create(name: "Tyrion Lannister'", thought: "I drink and I know things.") {
    id
  }
}

```
### Mutation With Nested Params

```
iex> query = %Query{
...>   operation: :update_breed,
...>   variables: [
...>     id: 12,
...>     params: [label: "label", abbreviation: "abbreviation"]
...>   ],
...>   fields: [:label, :abbreviation]
...> }

iex> GraphqlBuilder.mutation(query)
mutation {
  update_breed(id: 12, params: {label: "label", abbreviation: "abbreviation"}) {
    label,
    abbreviation
  }
}

```

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `graphql_builder` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:graphql_builder, "~> 0.1.0"}
  ]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/graphql_builder](https://hexdocs.pm/graphql_builder).