Packages
absinthe
1.5.0-alpha.4
1.11.0
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.0
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.8
1.6.7
retired
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.5.0-beta.2
1.5.0-beta.1
1.5.0-beta.0
1.5.0-alpha.4
1.5.0-alpha.3
1.5.0-alpha.2
1.5.0-alpha.1
1.5.0-alpha.0
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
retired
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.4.0-beta.5
1.4.0-beta.4
1.4.0-beta.3
1.4.0-beta.2
1.4.0-beta.1
1.3.2
1.3.1
1.3.0
1.3.0-rc.0
1.3.0-beta.2
1.3.0-beta.1
1.3.0-beta.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.2.0-beta.0
1.2.0-alpha0
1.2.0-alpha.2
1.2.0-alpha.1
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.2.3
0.2.2
0.2.1
0.1.0
GraphQL for Elixir
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/schema/notation/sdl.ex
defmodule Absinthe.Schema.Notation.SDL do
@moduledoc false
@doc """
Parse definitions from SDL source
"""
@spec parse(sdl :: String.t(), Module.t(), map(), Keyword.t()) ::
{:ok, [Absinthe.Blueprint.Schema.t()]} | {:error, String.t()}
def parse(sdl, module, ref, opts) do
with {:ok, doc} <- Absinthe.Phase.Parse.run(sdl) do
definitions =
doc.input.definitions
|> Enum.map(&Absinthe.Blueprint.Draft.convert(&1, doc))
|> Enum.map(&put_ref(&1, ref, opts))
|> Enum.map(fn type -> %{type | module: module} end)
{:ok, definitions}
else
{:error, %Absinthe.Blueprint{execution: %{validation_errors: [_ | _] = errors}}} ->
error =
errors
|> Enum.map(&"#{&1.message} (#{inspect(&1.locations)})")
|> Enum.join("\n")
{:error, error}
other ->
other
end
end
defp put_ref(%{fields: fields} = node, ref, opts) do
%{node | fields: Enum.map(fields, &put_ref(&1, ref, opts))}
|> do_put_ref(ref, opts)
end
defp put_ref(%{arguments: args} = node, ref, opts) do
%{node | arguments: Enum.map(args, &put_ref(&1, ref, opts))}
|> do_put_ref(ref, opts)
end
defp put_ref(%{directives: dirs} = node, ref, opts) do
%{node | directives: Enum.map(dirs, &put_ref(&1, ref, opts))}
|> do_put_ref(ref, opts)
end
defp put_ref(node, ref, opts), do: do_put_ref(node, ref, opts)
defp do_put_ref(%{__reference__: nil} = node, ref, opts) do
ref =
case opts[:path] do
nil ->
ref
path ->
put_in(ref.location, %{file: path, line: node.source_location.line})
end
%{node | __reference__: ref}
end
defp do_put_ref(node, _ref, _opts), do: node
end