Sha256: ee34520a65c1f31d6a78a2e1a23a07144e810dc7fc811251e5c3ae8e74470549

Contents?: true

Size: 1.63 KB

Versions: 6

Compression:

Stored size: 1.63 KB

Contents

# frozen_string_literal: true

class Serega
  module Plugins
    module Preloads
      #
      # Finds relations to preload for provided serializer
      #
      class PreloadsConstructor
        module ClassMethods
          #
          # Constructs preloads hash for given serializer
          #
          # @param serializer [Serega] Instance of Serega serializer
          #
          # @return [Hash]
          #
          def call(map)
            preloads = {}
            append_many(preloads, map)
            preloads
          end

          private

          def append_many(preloads, map)
            map.each do |attribute, nested_map|
              current_preloads = attribute.preloads
              next unless current_preloads

              has_nested = nested_map.any?
              current_preloads = Utils::EnumDeepDup.call(current_preloads) if has_nested
              append_current(preloads, current_preloads)
              next unless has_nested

              nested_preloads = nested(preloads, attribute.preloads_path)
              append_many(nested_preloads, nested_map)
            end
          end

          def append_current(preloads, current_preloads)
            merge(preloads, current_preloads) unless current_preloads.empty?
          end

          def merge(preloads, current_preloads)
            preloads.merge!(current_preloads) do |_key, value_one, value_two|
              merge(value_one, value_two)
            end
          end

          def nested(preloads, path)
            !path || path.empty? ? preloads : preloads.dig(*path)
          end
        end

        extend ClassMethods
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
serega-0.1.5 lib/serega/plugins/preloads/lib/preloads_constructor.rb
serega-0.1.4 lib/serega/plugins/preloads/lib/preloads_constructor.rb
serega-0.1.3 lib/serega/plugins/preloads/lib/preloads_constructor.rb
serega-0.1.2 lib/serega/plugins/preloads/lib/preloads_constructor.rb
serega-0.1.1 lib/serega/plugins/preloads/lib/preloads_constructor.rb
serega-0.1.0 lib/serega/plugins/preloads/lib/preloads_constructor.rb