Class: ApiSerializer::VariantsStore

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

Instance Method Summary collapse

Constructor Details

#initialize(variants = []) ⇒ VariantsStore

Returns a new instance of VariantsStore.



3
4
5
6
# File 'lib/api_serializer/variants_store.rb', line 3

def initialize(variants = [])
  @store = {}
  variants.each { |variant| store(variant) }
end

Instance Method Details

#cloneObject



42
43
44
# File 'lib/api_serializer/variants_store.rb', line 42

def clone
  self.class.new(variants)
end

#fetch(type, variant_name, abstract:, raise_error: false) ⇒ Object



12
13
14
15
16
17
# File 'lib/api_serializer/variants_store.rb', line 12

def fetch(type, variant_name, abstract:, raise_error: false)
  type_store = @store[type_key(type, abstract)]
  variant = type_store[variant_name] if type_store
  raise Errors::VariantNotFoundError, "Variant #{variant_name} (abstract: #{abstract}, type: #{type}) not found" if raise_error && variant.nil?
  variant
end

#fetch_with_fallback(type, variant_name, abstract:, raise_error: false) ⇒ Object



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

def fetch_with_fallback(type, variant_name, abstract:, raise_error: false)
  if abstract
    fetch(type, variant_name, abstract: true) ||
      fetch(:base, variant_name, abstract: true) ||
      fetch(:base, variant_name, abstract: true, raise_error:)
  else
    fetch(type, variant_name, abstract: false) ||
      fetch(type, variant_name, abstract: true) ||
      fetch(:base, variant_name, abstract: true, raise_error:)
  end
end

#store(variant) ⇒ Object



31
32
33
34
35
# File 'lib/api_serializer/variants_store.rb', line 31

def store(variant)
  key = type_key(variant.type, variant.abstract?)
  @store[key] ||= {}
  @store[key][variant.name] = variant
end

#type_key(type, abstract) ⇒ Object



37
38
39
40
# File 'lib/api_serializer/variants_store.rb', line 37

def type_key(type, abstract)
  prefix = abstract ? :fragment : :full
  "#{prefix}_#{type}"
end

#variantsObject



8
9
10
# File 'lib/api_serializer/variants_store.rb', line 8

def variants
  @store.values.flat_map(&:values)
end