README.md

GraphQL Elixir
==============

[![Build Status](https://travis-ci.org/joshprice/graphql-elixir.svg)](https://travis-ci.org/joshprice/graphql-elixir)
[![Public Slack Discussion](https://graphql-slack.herokuapp.com/badge.svg)](https://graphql-slack.herokuapp.com/)

An Elixir implementation of Facebook's GraphQL.

## Installation

First, add GraphQL to your `mix.exs` dependencies:

```elixir
defp deps do
  [{:graphql, "~> 0.0.2"}]
end
```

Then, update your dependencies:

```sh-session
$ mix deps.get
```

## Usage

Parse a simple GraphQL query

```elixir
iex> GraphQL.parse "{ hello }"
#=> [kind: :Document, loc: [start: 0],
#  definitions: [[kind: :OperationDefinition, loc: [start: 0], operation: :query,
#    selectionSet: [kind: :SelectionSet, loc: [start: 0],
#     selections: [[kind: :Field, loc: [start: 0], name: 'hello']]]]]]
```

## Status

This is a work in progress, right now here's what is done:

- [x] Parser for GraphQL (including Type definitions)
- [x] AST matching the `graphql-js` types as closely as possible
- [ ] Schema definition
- [ ] Query execution
- [ ] Introspection

## Resources

- [GraphQL Spec](http://facebook.github.io/graphql/) This incredibly well written spec made writing the GraphQL parser pretty straightforward.
- [GraphQL JS Reference Implementation](https://github.com/graphql/graphql-js)


## Implementation

Tokenisation is done with [leex](http://erlang.org/doc/man/leex.html) and parsing with [yecc](http://erlang.org/doc/man/yecc.html). Both very useful Erlang tools for parsing. Yecc in particular is used by Elixir itself.

Some resources on using leex and yecc:

* http://relops.com/blog/2014/01/13/leex_and_yecc/
* http://andrealeopardi.com/posts/tokenizing-and-parsing-in-elixir-using-leex-and-yecc/

## Developers

### Getting Started

Clone the repo and fetch its dependencies:

```
$ git clone https://github.com/joshprice/graphql-elixir.git
$ cd graphql-elixir
$ mix deps.get
$ mix test
```

### Atom Editor Support

>  Using the `language-erlang` package? `.xrl` and `.yrl` files not syntax highlighting?

Syntax highlighting in Atom for `leex` (`.xrl`) and `yecc` (`yrl`) can be added by modifying `grammars/erlang.cson`.

Just open the `atom-language-erlang` package code in Atom and make the change described here:

https://github.com/jonathanmarvens/atom-language-erlang/pull/11

however if that PR has been merged then just grab the latest version of the plugin!

Contributing
------------

We actively welcome pull requests, bug reports, feedback, issues, questions. Come and chat in the [#erlang channel on Slack](https://graphql-slack.herokuapp.com/)

License
-------

[BSD](https://github.com/joshprice/graphql-elixir/blob/master/LICENSE).