Packages
absinthe
1.5.3
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/blueprint/directive.ex
defmodule Absinthe.Blueprint.Directive do
@moduledoc false
alias Absinthe.{Blueprint, Phase}
@enforce_keys [:name]
defstruct [
:name,
arguments: [],
# When part of a Document
source_location: nil,
# Added by phases
schema_node: nil,
flags: %{},
errors: [],
__reference__: nil,
__private__: []
]
@type t :: %__MODULE__{
name: String.t(),
arguments: [Blueprint.Input.Argument.t()],
source_location: nil | Blueprint.SourceLocation.t(),
schema_node: nil | Absinthe.Type.Directive.t(),
flags: Blueprint.flags_t(),
errors: [Phase.Error.t()],
__reference__: nil,
__private__: []
}
@spec expand(t, Blueprint.node_t()) :: {t, map}
def expand(%__MODULE__{schema_node: nil}, node) do
node
end
def expand(%__MODULE__{schema_node: type} = directive, node) do
args = Blueprint.Input.Argument.value_map(directive.arguments)
case Absinthe.Type.function(type, :expand) do
nil ->
# Directive is a no-op
node
expansion when is_function(expansion) ->
expansion.(args, node)
end
end
@doc """
Determine the placement name for a given Blueprint node
"""
@spec placement(Blueprint.node_t()) :: nil | atom
def placement(%Blueprint.Document.Operation{type: type}), do: type
def placement(%Blueprint.Document.Field{}), do: :field
def placement(%Blueprint.Document.Fragment.Named{}), do: :fragment_definition
def placement(%Blueprint.Document.Fragment.Spread{}), do: :fragment_spread
def placement(%Blueprint.Document.Fragment.Inline{}), do: :inline_fragment
def placement(%Blueprint.Schema.SchemaDefinition{}), do: :schema
def placement(%Blueprint.Schema.SchemaDeclaration{}), do: :schema
def placement(%Blueprint.Schema.ScalarTypeDefinition{}), do: :scalar
def placement(%Blueprint.Schema.ObjectTypeDefinition{}), do: :object
def placement(%Blueprint.Schema.FieldDefinition{}), do: :field_definition
def placement(%Blueprint.Schema.InterfaceTypeDefinition{}), do: :interface
def placement(%Blueprint.Schema.UnionTypeDefinition{}), do: :union
def placement(%Blueprint.Schema.EnumTypeDefinition{}), do: :enum
def placement(%Blueprint.Schema.EnumValueDefinition{}), do: :enum_value
def placement(%Blueprint.Schema.InputObjectTypeDefinition{}), do: :input_object
def placement(%Blueprint.Schema.InputValueDefinition{placement: placement}), do: placement
end