Sha256: a15c8727f1a3a2edb6e3e722974b0a0a49dbe38cef31b815008294537775c5ab

Contents?: true

Size: 1.6 KB

Versions: 3

Compression:

Stored size: 1.6 KB

Contents

module Dry::Initializer
  # Immutable container for chunks of code describing argument signatures.
  # Responcible for building the resulting signature for the initializer args.
  class Signature
    include Enumerable
    include Errors

    def initialize(*list)
      @list = list
    end

    def add(*args)
      signature = Plugins::Signature.new(*args)

      validate_order_of signature
      validate_param_uniqueness_of signature
      validate_option_uniqueness_of signature
      validate_attribute_uniqueness_of signature

      self.class.new(*@list, signature)
    end

    def each
      @list.each { |item| yield item }
    end

    def call
      options = all?(&:param?) ? %w(__options__={}) : %w(**__options__)
      (select(&:param?).map(&:call) + options).compact.join(", ")
    end

    private

    def validate_param_uniqueness_of(signature)
      return unless signature.param?
      return unless select(&:param?).map(&:name).include? signature.name

      fail RedefinitionError.new(signature.name)
    end

    def validate_option_uniqueness_of(signature)
      return if signature.param?
      return unless reject(&:param?).map(&:name).include? signature.name

      fail RedefinitionError.new(signature.name)
    end

    def validate_attribute_uniqueness_of(signature)
      return unless map(&:rename).include? signature.rename

      fail RedefinitionError.new(signature.name)
    end

    def validate_order_of(signature)
      return unless signature.required? && signature.param?
      return unless reject(&:required?).any?(&:param?)

      fail OrderError.new(signature.name)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dry-initializer-0.11.0 lib/dry/initializer/signature.rb
dry-initializer-0.10.2 lib/dry/initializer/signature.rb
dry-initializer-0.10.1 lib/dry/initializer/signature.rb