Class: GraphQL::Schema::Enum
- Extended by:
- Member::ValidatesInput
- Defined in:
- lib/graphql/schema/enum.rb
Overview
Extend this class to define GraphQL enums in your schema.
By default, GraphQL enum values are translated into Ruby strings.
You can provide a custom value with the value:
keyword.
Direct Known Subclasses
Introspection::DirectiveLocationEnum, Introspection::TypeKindEnum
Defined Under Namespace
Classes: MissingValuesError, UnresolvedValueError
Constant Summary
Constants included from Member::GraphQLTypeNames
Member::GraphQLTypeNames::Boolean, Member::GraphQLTypeNames::ID, Member::GraphQLTypeNames::Int
Instance Attribute Summary
Attributes included from Member::BaseDSLMethods
#default_graphql_name, #graphql_name
Attributes included from Member::RelayShortcuts
#connection_type, #connection_type_class, #edge_type, #edge_type_class
Attributes included from Member::HasAstNode
Class Method Summary collapse
-
.all_enum_value_definitions ⇒ Array<Schema::EnumValue>
An unfiltered list of all definitions.
-
.coerce_input(value_name, ctx) ⇒ Object
Called by the runtime with incoming string representations from a query.
-
.coerce_result(value, ctx) ⇒ String
Called by the runtime when a field returns a value to give back to the client.
-
.enum_value_class(new_enum_value_class = nil) ⇒ Class
For handling
value(...)
inputs and buildingGraphQL::Enum::EnumValue
s out of them. -
.enum_values(context = GraphQL::Query::NullContext.instance) ⇒ Array<GraphQL::Schema::EnumValue>
Possible values of this enum.
-
.kind ⇒ Object
-
.validate_non_null_input(value_name, ctx, max_errors: nil) ⇒ Object
-
.value(*args, **kwargs, &block) ⇒ void
Define a value for this enum.
-
.values(context = GraphQL::Query::NullContext.instance) ⇒ Hash<String => GraphQL::Schema::EnumValue>
Possible values of this enum, keyed by name.
Methods included from Member::ValidatesInput
coerce_isolated_input, coerce_isolated_result, valid_input?, valid_isolated_input?, validate_input
Methods included from Member::BaseDSLMethods
#authorized?, #default_relay, #description, #introspection, #introspection?, #mutation, #name, #visible?
Methods included from Member::BaseDSLMethods::ConfigurationExtension
Methods included from Member::TypeSystemHelpers
#initialize, #kind, #list?, #non_null?, #to_list_type, #to_non_null_type, #to_type_signature
Methods included from Member::Scoped
#inherited, #reauthorize_scoped_objects, #scope_items
Methods included from Member::HasPath
Methods included from Member::HasAstNode
Methods included from Member::HasDirectives
add_directive, #directive, #directives, get_directives, #inherited, #remove_directive, remove_directive
Class Method Details
.all_enum_value_definitions ⇒ Array<Schema::EnumValue>
Returns An unfiltered list of all definitions.
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/graphql/schema/enum.rb', line 108 def all_enum_value_definitions all_defns = if superclass.respond_to?(:all_enum_value_definitions) superclass.all_enum_value_definitions else [] end @own_values && @own_values.each do |_key, value| if value.is_a?(Array) all_defns.concat(value) else all_defns << value end end all_defns end |
.coerce_input(value_name, ctx) ⇒ Object
Called by the runtime with incoming string representations from a query. It will match the string to a configured by name or by Ruby value.
180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
# File 'lib/graphql/schema/enum.rb', line 180 def coerce_input(value_name, ctx) all_values = ctx.types ? ctx.types.enum_values(self) : values.each_value # This tries matching by incoming GraphQL string, then checks Ruby-defined values if v = (all_values.find { |val| val.graphql_name == value_name } || all_values.find { |val| val.value == value_name }) if v.(ctx) v.value else raise GraphQL::UnauthorizedEnumValueError.new(type: self, enum_value: v, context: ctx) end else nil end end |
.coerce_result(value, ctx) ⇒ String
Called by the runtime when a field returns a value to give back to the client. This method checks that the incoming value matches one of the enum’s defined values.
163 164 165 166 167 168 169 170 171 172 |
# File 'lib/graphql/schema/enum.rb', line 163 def coerce_result(value, ctx) types = ctx.types all_values = types ? types.enum_values(self) : values.each_value enum_value = all_values.find { |val| val.value == value } if enum_value && (was_authed = enum_value.(ctx)) enum_value.graphql_name else raise self::UnresolvedValueError.new(enum: self, value: value, context: ctx, authorized: was_authed) end end |
.enum_value_class(new_enum_value_class = nil) ⇒ Class
Returns for handling value(...)
inputs and building GraphQL::Enum::EnumValue
s out of them.
132 133 134 135 136 137 138 139 140 |
# File 'lib/graphql/schema/enum.rb', line 132 def enum_value_class(new_enum_value_class = nil) if new_enum_value_class @enum_value_class = new_enum_value_class elsif defined?(@enum_value_class) && @enum_value_class @enum_value_class else superclass <= GraphQL::Schema::Enum ? superclass.enum_value_class : nil end end |
.enum_values(context = GraphQL::Query::NullContext.instance) ⇒ Array<GraphQL::Schema::EnumValue>
Returns Possible values of this enum.
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/graphql/schema/enum.rb', line 85 def enum_values(context = GraphQL::Query::NullContext.instance) inherited_values = superclass.respond_to?(:enum_values) ? superclass.enum_values(context) : nil visible_values = [] warden = Warden.from_context(context) own_values.each do |key, values_entry| if (v = Warden.visible_entry?(:visible_enum_value?, values_entry, context, warden)) visible_values << v end end if inherited_values # Local values take precedence over inherited ones inherited_values.each do |i_val| if !visible_values.any? { |v| v.graphql_name == i_val.graphql_name } visible_values << i_val end end end visible_values end |
.kind ⇒ Object
142 143 144 |
# File 'lib/graphql/schema/enum.rb', line 142 def kind GraphQL::TypeKinds::ENUM end |
.validate_non_null_input(value_name, ctx, max_errors: nil) ⇒ Object
146 147 148 149 150 151 152 153 154 155 |
# File 'lib/graphql/schema/enum.rb', line 146 def validate_non_null_input(value_name, ctx, max_errors: nil) allowed_values = ctx.types.enum_values(self) matching_value = allowed_values.find { |v| v.graphql_name == value_name } if matching_value.nil? GraphQL::Query::InputValidationResult.from_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:graphql_name).join(', ')}") else nil end end |
.value(*args, **kwargs, &block) ⇒ void
This method returns an undefined value.
Define a value for this enum
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/graphql/schema/enum.rb', line 66 def value(*args, **kwargs, &block) kwargs[:owner] = self value = enum_value_class.new(*args, **kwargs, &block) key = value.graphql_name prev_value = own_values[key] case prev_value when nil own_values[key] = value when GraphQL::Schema::EnumValue own_values[key] = [prev_value, value] when Array prev_value << value else raise "Invariant: Unexpected enum value for #{key.inspect}: #{prev_value.inspect}" end value end |
.values(context = GraphQL::Query::NullContext.instance) ⇒ Hash<String => GraphQL::Schema::EnumValue>
Returns Possible values of this enum, keyed by name.
127 128 129 |
# File 'lib/graphql/schema/enum.rb', line 127 def values(context = GraphQL::Query::NullContext.instance) enum_values(context).each_with_object({}) { |val, obj| obj[val.graphql_name] = val } end |