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, value_method: nil, **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?, #comment, #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.
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/graphql/schema/enum.rb', line 128 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.
202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/graphql/schema/enum.rb', line 202 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.
185 186 187 188 189 190 191 192 193 194 |
# File 'lib/graphql/schema/enum.rb', line 185 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.
152 153 154 155 156 157 158 159 160 |
# File 'lib/graphql/schema/enum.rb', line 152 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.
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/graphql/schema/enum.rb', line 91 def enum_values(context = GraphQL::Query::NullContext.instance) inherited_values = superclass.respond_to?(:enum_values) ? superclass.enum_values(context) : nil visible_values = [] types = Warden.types_from_context(context) own_values.each do |key, values_entry| visible_value = nil if values_entry.is_a?(Array) values_entry.each do |v| if types.visible_enum_value?(v, context) if visible_value.nil? visible_value = v visible_values << v else raise DuplicateNamesError.new( duplicated_name: v.path, duplicated_definition_1: visible_value.inspect, duplicated_definition_2: v.inspect ) end end end elsif types.visible_enum_value?(values_entry, context) visible_values << values_entry 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
162 163 164 |
# File 'lib/graphql/schema/enum.rb', line 162 def kind GraphQL::TypeKinds::ENUM end |
.validate_non_null_input(value_name, ctx, max_errors: nil) ⇒ Object
166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/graphql/schema/enum.rb', line 166 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 # rescue MissingValuesError # nil end |
.value(*args, value_method: nil, **kwargs, &block) ⇒ void
This method returns an undefined value.
Define a value for this enum
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/graphql/schema/enum.rb', line 69 def value(*args, value_method: nil, **kwargs, &block) kwargs[:owner] = self value = enum_value_class.new(*args, **kwargs, &block) generate_value_method(value, value_method) 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.
147 148 149 |
# File 'lib/graphql/schema/enum.rb', line 147 def values(context = GraphQL::Query::NullContext.instance) enum_values(context).each_with_object({}) { |val, obj| obj[val.graphql_name] = val } end |