Class: ApiSerializer::VariantResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/api_serializer/variant_resolver.rb

Constant Summary collapse

NESTED_FALLBACKS =

Fallback chain for nested association serialization: when the requested variant doesn’t exist on a nested schema, try these in order.

[:nested, :minimal, :id_only].freeze

Instance Method Summary collapse

Constructor Details

#initialize(variant_store, type, variant_mappings = {}) ⇒ VariantResolver

Returns a new instance of VariantResolver.



7
8
9
10
11
# File 'lib/api_serializer/variant_resolver.rb', line 7

def initialize(variant_store, type, variant_mappings = {})
  @variant_store = variant_store
  @type = type
  @variant_mappings = variant_mappings
end

Instance Method Details

#resolve(name) ⇒ Object



13
14
15
# File 'lib/api_serializer/variant_resolver.rb', line 13

def resolve(name)
  @variant_store.fetch(@type, target_variant_name(name), abstract: false, raise_error: true)
end

#resolve_transformer(name) ⇒ Object



31
32
33
# File 'lib/api_serializer/variant_resolver.rb', line 31

def resolve_transformer(name)
  resolve(name).transformer
end

#resolve_with_nested_fallback(name) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/api_serializer/variant_resolver.rb', line 17

def resolve_with_nested_fallback(name)
  resolve(name)
rescue Errors::VariantNotFoundError
  NESTED_FALLBACKS.each do |fallback|
    next if fallback == target_variant_name(name)
    begin
      return resolve(fallback)
    rescue Errors::VariantNotFoundError
      next
    end
  end
  raise Errors::VariantNotFoundError, "No suitable variant found for nested serialization (tried #{name}, then #{NESTED_FALLBACKS.join(", ")})"
end