Sha256: d420a31b7fae9aa352708128695088dd8443d1bea151241b4738424424e73dc1

Contents?: true

Size: 1.17 KB

Versions: 1

Compression:

Stored size: 1.17 KB

Contents

# frozen_string_literal: true

module Phlexi
  module Form
    module Structure
      class NamespaceCollection < Node
        include Enumerable

        def initialize(key, parent:, collection: nil, &block)
          raise ArgumentError, "block is required" unless block.present?

          super(key, parent: parent)

          @collection = collection
          @block = block
          each(&block)
        end

        def extract_input(params)
          namespace = build_namespace(0)
          @block.call(namespace)

          inputs = params[key].map { |param| namespace.extract_input([param]) }
          {key => inputs}
        end

        private

        def each(&)
          namespaces.each(&)
        end

        # Builds and memoizes namespaces for the collection.
        #
        # @return [Array<Hash>] An array of namespace hashes.
        def namespaces
          @namespaces ||= @collection.map.with_index do |object, key|
            build_namespace(key, object: object)
          end
        end

        def build_namespace(index, **)
          parent.class.new(index, parent: self, builder_klass: parent.builder_klass, **)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
phlexi-form-0.3.0.rc1 lib/phlexi/form/structure/namespace_collection.rb