An Elixir implementation of Facebook's GraphQL.
This is the core GraphQL query parsing and execution engine whose goal is to be transport, server and datastore agnostic.
In order to setup an HTTP server (ie Phoenix) to handle GraphQL queries you will need plug_graphql.
Other ways of handling queries will be added in due course.
First, add GraphQL to your mix.exs
dependencies:
defp deps do
[{:graphql, "~> 0.0.6"}]
end
Then, update your dependencies:
$ mix deps.get
First setup your schema
defmodule TestSchema do
def schema do
%GraphQL.Schema{
query: %GraphQL.ObjectType{
name: "RootQueryType",
fields: %{
greeting: %GraphQL.FieldDefinition{
type: "String",
resolve: &TestSchema.greeting/3
}
}
}
}
end
def greeting(_, %{name: name}, _), do: "Hello, #{name}!"
def greeting(_, _, _), do: "Hello, world!"
end
Execute a simple GraphQL query
iex> GraphQL.execute(TestSchema.schema, "{greeting}")
{:ok, %{greeting: "Hello, world!"}}
This is a work in progress, right now here's what is done:
- Parser for GraphQL (including Type definitions)
- AST matching the
graphql-js
types as closely as possible - Schema definition
- [WIP] Query execution
- [WIP] Query validation
- Introspection
- GraphQL Spec This incredibly well written spec made writing the GraphQL parser pretty straightforward.
- GraphQL JS Reference Implementation
Tokenisation is done with leex and parsing with yecc. 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/
Clone the repo and fetch its dependencies:
$ git clone https://github.com/joshprice/graphql-elixir.git
$ cd graphql-elixir
$ mix deps.get
$ mix test
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:
jonathanmarvens/atom-language-erlang#11
however if that PR has been merged then just grab the latest version of the plugin!
We actively welcome pull requests, bug reports, feedback, issues, questions. Come and chat in the #erlang channel on Slack
BSD.