From 415ad01c2b4e784f7ed94e1ac484b9740145581d Mon Sep 17 00:00:00 2001 From: Josh Price Date: Mon, 7 Mar 2016 22:37:42 +1100 Subject: [PATCH] Adapt libgraphqlparser AST to graphql elixir AST - remove nil values - use atoms for kind and operation keys - use ListValue not ArrayValue Paired with @aarvay --- lib/graphql/parser.ex | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/graphql/parser.ex b/lib/graphql/parser.ex index efd0596..99fff68 100644 --- a/lib/graphql/parser.ex +++ b/lib/graphql/parser.ex @@ -1,10 +1,31 @@ defmodule GraphQL.Parser do + + def adapt_ast(map) when is_map(map) do + map + |> Enum.filter(fn {_,v} -> v != nil end) + |> Enum.reduce(%{}, fn({k, v}, acc) -> + if k in [:kind, :operation] do + if v == "ArrayValue" do + v = "ListValue" + end + Map.put(acc, k, String.to_atom(v)) + else + Map.put(acc, k, adapt_ast(v)) + end + end) + end + def adapt_ast(list) when is_list(list) do + Enum.map(list, &adapt_ast/1) + end + def adapt_ast(x), do: x + def parse(graphql) do result = GraphQL.Parser.Nif.parse(graphql) case result do {:ok, json} -> - {:ok, Poison.Parser.parse!(json, keys: :atoms)} + ast = Poison.Parser.parse!(json, keys: :atoms) + {:ok, adapt_ast(ast)} {:error, message} -> {:error, message} end