enum_type_definition.ex (2458B)
1 defmodule Absinthe.Blueprint.Schema.EnumTypeDefinition do 2 @moduledoc false 3 4 alias Absinthe.Blueprint 5 6 @enforce_keys [:name] 7 defstruct [ 8 :name, 9 :identifier, 10 :description, 11 :module, 12 values: [], 13 directives: [], 14 source_location: nil, 15 # Added by phases, 16 flags: %{}, 17 errors: [], 18 __reference__: nil, 19 __private__: [] 20 ] 21 22 @type t :: %__MODULE__{ 23 name: String.t(), 24 values: [Blueprint.Schema.EnumValueDefinition.t()], 25 directives: [Blueprint.Directive.t()], 26 identifier: atom, 27 source_location: nil | Blueprint.SourceLocation.t(), 28 # Added by phases 29 flags: Blueprint.flags_t(), 30 errors: [Absinthe.Phase.Error.t()] 31 } 32 def build(type_def, _schema) do 33 %Absinthe.Type.Enum{ 34 identifier: type_def.identifier, 35 name: type_def.name, 36 values: values_by(type_def, :identifier), 37 values_by_internal_value: values_by(type_def, :value), 38 values_by_name: values_by(type_def, :name), 39 definition: type_def.module, 40 description: type_def.description 41 } 42 end 43 44 def values_by(type_def, key) do 45 for value_def <- List.flatten(type_def.values), into: %{} do 46 case value_def do 47 %Blueprint.Schema.EnumValueDefinition{} -> 48 value = %Absinthe.Type.Enum.Value{ 49 name: value_def.name, 50 value: value_def.value, 51 enum_identifier: type_def.identifier, 52 __reference__: value_def.__reference__, 53 description: value_def.description, 54 deprecation: value_def.deprecation 55 } 56 57 {Map.fetch!(value_def, key), value} 58 59 # Values defined via dynamic function calls don't yet get converted 60 # into proper Blueprints, but it works for now. This will get refactored 61 # in the future as we build out a general solution for dynamic values. 62 raw_value -> 63 name = raw_value |> to_string() |> String.upcase() 64 65 value_def = %{ 66 name: name, 67 value: raw_value, 68 identifier: raw_value 69 } 70 71 value = %Absinthe.Type.Enum.Value{ 72 name: name, 73 value: raw_value, 74 enum_identifier: type_def.identifier 75 } 76 77 {Map.fetch!(value_def, key), value} 78 end 79 end 80 end 81 82 defimpl Inspect do 83 defdelegate inspect(term, options), 84 to: Absinthe.Schema.Notation.SDL.Render 85 end 86 end