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?, #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.
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/graphql/schema/enum.rb', line 123 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.
197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/graphql/schema/enum.rb', line 197 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.
180 181 182 183 184 185 186 187 188 189 |
# File 'lib/graphql/schema/enum.rb', line 180 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.
147 148 149 150 151 152 153 154 155 |
# File 'lib/graphql/schema/enum.rb', line 147 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.
86 87 88 89 90 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 |
# File 'lib/graphql/schema/enum.rb', line 86 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
157 158 159 |
# File 'lib/graphql/schema/enum.rb', line 157 def kind GraphQL::TypeKinds::ENUM end |
.validate_non_null_input(value_name, ctx, max_errors: nil) ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/graphql/schema/enum.rb', line 161 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, **kwargs, &block) ⇒ void
This method returns an undefined value.
Define a value for this enum
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/graphql/schema/enum.rb', line 67 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.
142 143 144 |
# File 'lib/graphql/schema/enum.rb', line 142 def values(context = GraphQL::Query::NullContext.instance) enum_values(context).each_with_object({}) { |val, obj| obj[val.graphql_name] = val } end |