Module: Desiru::GraphQL::EnumBuilder

Extended by:
EnumBuilder
Included in:
EnumBuilder
Defined in:
lib/desiru/graphql/enum_builder.rb

Overview

Handles GraphQL enum type generation

Instance Method Summary collapse

Instance Method Details

#create_enum_from_values(values, type_cache, cache_mutex) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/desiru/graphql/enum_builder.rb', line 37

def create_enum_from_values(values, type_cache, cache_mutex)
  cache_key = "LiteralEnum:#{values.sort.join(',')}"

  cache_mutex.synchronize do
    return type_cache[cache_key] if type_cache[cache_key]
  end

  enum_name = "Literal#{cache_key.hash.abs}Enum"

  enum_type = Class.new(::GraphQL::Schema::Enum) do
    graphql_name enum_name

    values.each do |val|
      value val.upcase.gsub(/[^A-Z0-9_]/, '_'), value: val
    end
  end

  cache_mutex.synchronize do
    type_cache[cache_key] = enum_type
  end

  enum_type
end

#create_enum_type(field, type_cache, cache_mutex) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/desiru/graphql/enum_builder.rb', line 11

def create_enum_type(field, type_cache, cache_mutex)
  values = extract_literal_values(field)
  cache_key = "Enum:#{field.name}:#{values.sort.join(',')}"

  cache_mutex.synchronize do
    return type_cache[cache_key] if type_cache[cache_key]
  end

  enum_name = "#{field.name.to_s.capitalize}Enum#{cache_key.hash.abs}"

  enum_type = Class.new(::GraphQL::Schema::Enum) do
    graphql_name enum_name
    description "Enum for #{field.name}"

    values.each do |val|
      value val.upcase.gsub(/[^A-Z0-9_]/, '_'), value: val
    end
  end

  cache_mutex.synchronize do
    type_cache[cache_key] = enum_type
  end

  enum_type
end