Packages
absinthe
1.7.2
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
"""
alias Absinthe.{Blueprint, Language.Source}
@spec parse(sdl :: Source.t() | Blueprint.t(), module(), map(), Keyword.t()) ::
{:ok, [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, %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, directives: directives} = node, ref, opts) do
%{
node
| fields: Enum.map(fields, &put_ref(&1, ref, opts)),
directives: Enum.map(directives, &put_ref(&1, ref, opts))
}
|> do_put_ref(ref, opts)
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, directives: directives} = node, ref, opts) do
%{
node
| arguments: Enum.map(args, &put_ref(&1, ref, opts)),
directives: Enum.map(directives, &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(%{definition: definition} = node, ref, opts) do
%{node | definition: put_ref(definition, ref, opts)}
|> do_put_ref(ref, opts)
end
defp put_ref(%{directives: directives} = node, ref, opts) do
%{node | directives: Enum.map(directives, &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: {:unquote, [], [path]},
line: node.source_location.line,
column: node.source_location.column
})
end
%{node | __reference__: ref}
end
defp do_put_ref(node, _ref, _opts), do: node
end